0618,0619 ,指针,指针与数组,字符串

news2024/11/24 18:44:39

目录

第八章(指针),第九章(指针和数组),第十章(字符串)思维导图

作业1  逆序打印

解答:

答案:

作业2  判断回文

解答:

答案:

作业3  比较单词

解答:

答案:

619作业1:搜索字符串末尾

解答:

答案:

 619作业2:自己版本的 strlen

解答:

619作业3:自己版本的 strcpy

解答:

619作业4:自己版本的 strcat

解答:

619作业5:自己版本的 strcmp

解答:

作业1  逆序打印

(a) 编写程序读一条消息,然后逆序打印这条消息:

Enter a message: Don't get mad, get even.
Reversal is: .neve teg ,dam teg t'noD

提示:一次读取消息中的一个字符(用getchar函数),并且把这些字母存储在数组中,当数组满了或者读到字符 '\n' 时停止读操作。

(b) 修改上述程序,用指针代替整数来跟踪数组的当前位置。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX_NUM 1000

void read_char(char* str, int len) {
	char c; int i = 0;
	while ((c = getchar()) != '\n') {
		str[i++] = c;
	}
	str[i] = '\0';
}

void re_print(char* str, int len) {
	int i = 0;
	for (i = 0; str[i]; i++)
		;
	i--;
	for (; i != 0; i--) {
		putchar(str[i]);
	}
	putchar(str[i]);
	putchar('\n');
}

void re_print02(char* str, int len) {
	char* p = str;
	while (*p++)
		;
	p--; p--;
	while ( p != str) {
		putchar(*p--);
	}
	putchar(*p);
	putchar('\n');
}


int main(void) {
	
	char str[MAX_NUM];
	printf("Enter a message: ");
	read_char(str, MAX_NUM);
	printf("Reversal is: ");
	re_print(str, MAX_NUM);
	re_print02(str, MAX_NUM);
	return 0;
}

答案:

不是使用函数,录入的指针P可以直接使用逆序输出
(n < MAXLINE && (c = getchar()) != '\n'       必须检查数组是否越界,顺序不能改变(逻辑)

(a)

#include <stdio.h>

#define MAXLINE 128

int main(void) {
    printf("Enter a message: ");

    char message[MAXLINE];
    int n = 0;
    char c;
    while (n < MAXLINE && (c = getchar()) != '\n') {
        message[n] = c;
        n++;
    }   // n == MAXLINE || c == '\n'

    printf("Reversal is: ");

    for (int i = n - 1; i >= 0; i--) {
        putchar(message[i]);
    }
    putchar('\n');

    return 0;
}
(b)

#include <stdio.h>

#define MAXLINE 128

int main(void) {
    printf("Enter a message: ");

    char message[MAXLINE];
    char* p = message;
    char c;
    while (p < message + MAXLINE && (c = getchar()) != '\n') {
        *p++ = c;
    }   // p == message + MAXLINE || c == '\n'
    // p 指向最后一个字符后面

    printf("Reversal is: ");

    p--;
    while (p >= message) {
        putchar(*p--);
    }
    putchar('\n');

    return 0;
}

作业2  判断回文

(a) 编写程序读一条消息,然后检查这条消息是否是回文(消息从左往右看和从右往左看是一样的):

Enter a message: He lived as a devil, eh?
Palindrome

Enter a message: Madam, I am Adam.
Not a palindrome

忽略所有不是字母的字符。用索引来跟踪数组中的位置。

(b)修改上述程序,使用指针代替索引来跟踪数组中的位置。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define MAX_NUM 1000

//首字母大小写不限,单词断句是一样的,符号对比忽略
void read_char(char* str, int len) {
	char c; 
	char *p1 = str; 
	bool blank=true;

	//忽略字母前面的空白字符
	while ((c = getchar()) == ' ')
		;
	*p1++ = c;
	while ((c = getchar()) != '\n') {
		 //符号处理
		if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {   //字母判断!可恶!
			*p1++ = c;
			blank = true;
		}else if (blank) {
			*p1++ = ' ';
			blank = false;
		}
	}
	//最后一个字符不要存空格
	*p1--;*p1 = '\0';
	
}

bool judge01(char* str, int len) {
	
}

bool judge02(char* str, int len) {
	char* p = str;
	while (*p++)
		;
	p--; p--;//定位到末尾  两个!!!
	char* p1 = str;
	//排除首字母大写
	/*putchar(*p);
	putchar(*p1);*/
	if ((*p - *p1) == ('z' - 'Z')|| *p == *p1) {
		p--; p1++;
	}
	else {
		return false;
	}
	while ((p != p1) && ((*p--) == (*p1++)))  //指针往中间移动,且比较元素
		;
	//退出条件,指针相等或者者元素不相等
	if (p-p1<=1) {
		return true;
	}
	else {
		return false;
	}
}


int main(void) {

	char str[MAX_NUM];
	char re_str[MAX_NUM];
	printf("Enter a message: ");
	read_char(str, MAX_NUM);
	printf("%s\n", str);
	judge01(str, MAX_NUM) ? printf("Palindrome\n") : printf("Not a palindrome\n");
	judge02(str, MAX_NUM)? printf("Palindrome\n") : printf("Not a palindrome\n");
	return 0;
}

答案:

答案思路——完全输入——比较(只比较字母)

 while (i < j && !isalpha(message[i]))       isalpha,标准库函数,是否是字母

 if (tolower(message[i]) != tolower(message[j])) return false;        tolower,toupper标准库函数,转换成小写字母

(a)

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

#define MAXLINE 128

bool is_palindrome(char message[], int n) {
    int i = 0, j = n - 1;
    while (i < j) {
        while (i < j && !isalpha(message[i])) {
            i++;
        }   // i == j || message[i] is a alphabet

        while (i < j && !isalpha(message[j])) {
            j--;
        }   // i == j || message[j] is a alphabet

        if (tolower(message[i]) != tolower(message[j])) return false;

        i++;
        j--;
    }
    return true;
}

int main(void) {
    printf("Enter a message: ");

    char message[MAXLINE];
    int n = 0;
    char c;
    while (n < MAXLINE && (c = getchar()) != '\n') {
        message[n] = c;
        n++;
    }   // n == MAXLINE || c == '\n'

    if (is_palindrome(message, n)) {
        printf("Palindrome\n");
    } else {
        printf("Not a palindrome\n");
    }

    return 0;
}
(b)

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

#define MAXLINE 128

bool is_palindrome(char* start, char* end) {
    while (start < end) {
        while (start < end && !isalpha(*start)) {
            start++;
        }   // i == j || message[i] is a alphabet

        while (start < end && !isalpha(*end)) {
            end--;
        }   // i == j || message[j] is a alphabet

        if (tolower(*start) != tolower(*end)) return false;

        start++;
        end--;
    }
    return true;
}

int main(void) {
    printf("Enter a message: ");

    char message[MAXLINE];
    char* p = message;
    char c;
    while (p < message + MAXLINE && (c = getchar()) != '\n') {
        *p++ = c;
    }   // p == message + MAXLINE || c == '\n'
    // p 指向最后一个字符后面

    if (is_palindrome(message, p - 1)) {
        printf("Palindrome\n");
    } else {
        printf("Not a palindrome\n");
    }

    return 0;
}

作业3  比较单词

编写程序找出一组单词中最小单词和最大单词。当用户输入4个字母的单词时,程序停止读入。假设所有单词都不超过20个字母。程序会话如下:

Enter word: dog
Enter word: zebra
Enter word: rabbit
Enter word: catfish
Enter word: walrus
Enter word: cat
Enter word: fish

Smallest word: cat
Largest word: zebra
提示:使用两个名为 smallest_word 和 largest_word 的字符串来分别记录最小单词和最大单词。
用户每输入一个新单词,都要用 strcmp 把它与 smallest_word 和 largest_word 进行比较。
用 strlen 函数判断用户是否输入了 4 个字母的单词。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_NUM 21


int main(void) {
	char blank[MAX_NUM] = "";
	char arr[MAX_NUM];
	char max[MAX_NUM]="";
	char min[MAX_NUM]="";
	char c; char* p ; bool first = true;
	while (1) {
		printf("Enter word: ");
		p = arr;//初始化p
		strcpy(arr, blank);
		while ((c = getchar()) == ' ')
			;
		*p++ = c;
		while ((c = getchar()) != '\n') {
			*p++ = c;
		}
		*p = '\0';
		
		if (strlen(arr) == 4) {
			break;
		}
		if (first) {
			strcpy(max, arr);
			strcpy(min, arr);
			first = false;
		}
		if(strcmp(arr,max)>0){
			strcpy(max, arr);
		}else if (strcmp(arr, min)<0) {
			strcpy(min, blank);
			strcpy(min, arr);
		}
	}
	printf("Largest word: %s\n", max);
	printf("Smallest word: %s\n", min);

	return 0;
}

答案:

字符串读写,不要用getchar 和 putchar了

scanf("%s",word)  的匹配规则

忽略前置空白字符,读取字符,填入字符数组,遇到空白字符结束——适合空白字符分割的单词读入

不检查数组越界,记得检查

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

#define MAXWORD 21

int main(void) {
	char smallest_word[MAXWORD];	
	char largest_word[MAXWORD];
	char word[MAXWORD];
	// 用第一个单词初始化 smallest_word 和 largest_word
	printf("Enter word: ");
	scanf("%s", word);
	strcpy(smallest_word, word);
	strcpy(largest_word, word);

	while (strlen(word) != 4) {
		printf("Enter word: ");
		scanf("%s", word);
		
		if (strcmp(word, smallest_word) < 0) {
			strcpy(smallest_word, word);
		} else if (strcmp(word, largest_word) > 0) {
			strcpy(largest_word, word);
		}
	};

	printf("\nSmallest word: %s\n", smallest_word);
	printf("Largest word: %s\n", largest_word);
	return 0;
}

619作业1:搜索字符串末尾

编写下面的函数:

void remove_filename(char* url);

url 指向一个包含以文件名结尾的 URL 字符串,例如 "http://www.knking.com/index.html"。函数需要移除文件名和前面的斜杠。(在上面的例子中,结果为 "http://www.knking.com")。要求在函数中使用 "搜索字符串末尾" 的惯用法。

提示:把字符串中的最后一个斜杠替换为空字符。

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100

void remove_filename(char* url) {
	fgets(url, MAXNUM, stdin);
	char* p = url;
	int count = 0;

	while (count != 3 && p < url + MAXNUM && *p) {
		if (*p == '/') {
			count++;
		}
		p++;
	}//break  *p=='/'
	p--;
	*p = '\0';
	puts(url);
}
int main(void) {
	char str[MAXNUM] = "";
	remove_filename(str);
	return 0;
}

答案:

多种情况下,是找到最后一个P,而不是限制第三个
也不需要计数,每次*URL==‘/’的时候,用指针P记录地址,遍历完整之后,指针P记录的就是最后一个‘/’的地址,修改成‘\0'

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void remove_filename(char* url) {
	char* p = url;
	// 搜索最后一个 '/'
	while (*url) {
		if (*url == '/') {
			p = url;
		}
		url++;
	}
	if (*p == '/') {
		*p = '\0';
	}
}

int main(void) {
	char url[] = "http://www.knking.com/index.html";
	remove_filename(url);
	puts(url);
	return 0;
}

 619作业2:自己版本的 strlen

size_t my_strlen(const char* s);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100

size_t my_strlen(const char* s) {
	char* p = s; size_t num = 0;
	
	while (*p) {
		num++;
		p++;
	}
	return num;
}

int main(void) {
	char s[] = "i love xixi";
	printf("my_strlen is % d\n",my_strlen(s));
	printf("strlen is % d\n", strlen(s));
	return 0;
}

619作业3:自己版本的 strcpy

char* my_strcpy(char* s1, const char* s2);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100

char* my_strcpy(char* s1, const char* s2) {
	char* p1 = s1;
	char* p2 = s2;
	while (*p1++ = *p2++)
		;
	return s1;
}
int main(void) {
	char s[MAXNUM] = "i love xixi";
	char s2[MAXNUM] = "";
	char s3[MAXNUM] = "";
	my_strcpy(s2, s);
	strcpy(s3, s);
	puts(s2); puts(s3);
	return 0;
}

619作业4:自己版本的 strcat

char* my_strcat(char* s1, const char* s2);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100

char* my_strcat(char* s1, const char* s2) {
	int* p = s1;
	int* p1 = s2;
	while (*p) {
		p++;
	}
	while (*p++ = *p1++)
		;
	*p = '\0';
	return s1;
}

int main(void) {
	char s[MAXNUM] = " i love xixi";
	char s1[MAXNUM] = "i love panpan ";
	char s2[MAXNUM] = "huasheng and";
	my_strcat(s2, s); //huasheng and i love xixi
	strcat(s1, s);    //i love panpan i love xixi
	puts(s2); puts(s1);
	return 0;
}

619作业5:自己版本的 strcmp

int my_strcmp(const char* s1, const char* s2);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXNUM 100

int my_strcmp(const char* s1, const char* s2) {
	char* p = s1; char* p1 = s2;
	while (*p++ == *p1++)
		;
	return *(p--) - *(p1--);
}

int main(void) {
	char s[MAXNUM] = "i love xixi";
	char s1[MAXNUM] = "i love panpan ";
	my_strcmp(s, s1) > 0 ? printf("i love xixi is big\n") : printf("i love panpan is big\n");
	strcmp(s, s1) > 0 ? printf("i love xixi is big\n") : printf("i love panpan is big\n");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB设计隐藏的陷进

1、BGA芯片的开窗和过油设计。 加工工艺中&#xff0c;范式过孔都需要盖油设计&#xff0c;实心焊盘需要开窗设计&#xff0c;坚决不能盖油。 2、通孔设计的互联连通性 比如H3芯片的wifi设计&#xff0c;实际上是没有联通的&#xff0c;虽然四层板的中间层有焊盘&#xff0c;但…

【C++ | 移动构造函数】C++11的 移动构造函数 详解及例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-12 2…

Mamaba3--RNN、状态方程、勒让德多项式

Mamaba3–RNN、状态方程、勒让德多项式 一、简单回顾 在Mamba1和Mamba2中分别介绍了RNN和状态方程。 下面从两个图和两个公式出发&#xff0c;对RNN和状态方程做简单的回顾&#xff1a; R N N : s t W s t − 1 U x t &#xff1b; O t V s t RNN: s_t Ws_{t-1}Ux_t&…

前字节员工自爆:我原腾讯一哥们,跳槽去小公司做小领导,就签了竞业,又从小公司离职去了对手公司,结果被发现了,小公司要他赔80万

“世界那么大&#xff0c;我想去看看”&#xff0c;这句曾经火遍网络的辞职宣言&#xff0c;说出了多少职场人心中的渴望。然而&#xff0c;当我们真的迈出跳槽那一步时&#xff0c;才发现&#xff0c;现实远比想象中残酷得多。 最近&#xff0c;一起前字节跳动员工爆料的事件…

22种常用设计模式示例代码

文章目录 创建型模式结构型模式行为模式 仓库地址https://github.com/Xiamu-ssr/DesignPatternsPractice 参考教程 refactoringguru设计模式-目录 创建型模式 软件包复杂度流行度工厂方法factorymethod❄️⭐️⭐️⭐️抽象工厂abstractfactory❄️❄️⭐️⭐️⭐️生成器bui…

自学网络安全 or Web安全,一般人我还是劝你算了吧

由于我之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&#xff1f;…

福昕PDF编辑器快速去除PDF水印方法

在福昕PDF编辑器软件中打开一个带有水印的PDF文件&#xff0c;点击如图下所示的页面管理->水印&#xff0c;点击全部移除 点击 是 水印消除&#xff08;注&#xff1a;部分类型的水印可以消除&#xff0c;但是有些类型的水印无法通过此方法消除&#xff09;

Day28:回溯法 491.递增子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独 蓝桥杯 与或异或

491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情…

Flask新手入门(一)

前言 Flask是一个用Python编写的轻量级Web应用框架。它最初由Armin Ronacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包&#xff0c;提供了各种用于Web应用开发的工具和函数。自发布以来&#xff0c;Flask因其简洁和灵活性而迅速受到开发者的欢迎。…

昇思大模型学习·第一天

mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…

Docker(四)-Docker镜像

1.概念 镜像是一种轻量级的、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖 打包好形成一个可交付的运行环境(包括代码&#xff0c;运行时需要的库&#xff0c;环境变量和配置文件等)&#xff0c;这个打包好的运行环境…

docker pull xxx拉取超时time out

文章目录 前言总结 前言 换了镜像源&#xff0c;改配置的都不行&#xff0c;弄了一个下午&#xff0c;最后运行一下最高指令就可以了 sudo docker_OPTS"--dns 8.8.8.8"总结 作者&#xff1a;加辣椒了吗&#xff1f; 简介&#xff1a;憨批大学生一枚&#xff0c;喜欢…

STM32自己从零开始实操06:无线电路原理图

一、WIFI 模块电路设计 1.1指路 延续使用 ESP-12S 芯片&#xff0c;封装 SMD 16x24mm。 实物图 原理图与PCB图 2.2电路图 电路较为简单&#xff0c;如下图&#xff1a; 2.2.1引脚说明 序号引脚名称描述1RST复位复位引脚&#xff0c;低电平有效3EN使能芯片使能端&#xff0c…

【深度学习】sdwebui A1111 加速方案对比,xformers vs Flash Attention 2

文章目录 资料支撑资料结论sdwebui A1111 速度对比测试sdxlxformers 用contorlnet sdxlsdpa&#xff08;--opt-sdp-no-mem-attention&#xff09; 用contorlnet sdxlsdpa(--opt-sdp-attention) 用contorlnet sdxl不用xformers或者sdpa ,用contorlnet sdxl不用xformers或者sdpa …

Windows安装配置jdk和maven(仅做记录)

他妈的远程连接不上公司电脑&#xff0c;只能在家重新配置一遍&#xff0c;在此记录一下后端环境全部配置 Windows安装配置JDK 1.8一、下载 JDK 1.8二、配置环境变量三、验证安装 Windows安装配置Maven 3.8.8一、下载安装 Maven并配置环境变量二、设置仓库镜像及本地仓库三、测…

BUU CODE REVIEW 11 代码审计之反序列化知识

打开靶场&#xff0c;得到的是一段代码。 通过分析上面代码可以构造下面代码&#xff0c;获取到序列化之后的obj。 <?php class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(u…

如何解决input输入时存在浏览器缓存问题?

浏览器有时会在你输入表单过后缓存你的输入&#xff0c;有时候能提供方便。 但是在某些新建或新页面情况下出现历史的输入信息&#xff0c;用户体验很差。 解决方案 设置 autocomplete关闭 &#xff1a;<input type"text" autocomplete"off">增加…

[AIGC] MyBatis-Plus中如何使用XML进行CRUD操作?

在MyBatis-Plus中&#xff0c;我们可以非常方便地使用XML进行CRUD&#xff08;创建、读取、更新、删除&#xff09;操作。以下是一些基本步骤和示例&#xff0c;希望能帮助到还在初学阶段的您。 文章目录 1. 创建Mapper接口2. 创建Mapper XML 文件3. 调用Mapper方法 1. 创建Ma…

【golang学习之旅】Go程序快速开始 Go程序开发的基本注意事项

系列文章 【golang学习之旅】使用VScode安装配置Go开发环境 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 p…

【云原生|K8S系列】如何创建Kubernetes job和Cronjobs 入门指南

本kubernetes教程解释了如何创建kubernetes作业和cronjobs&#xff0c;以及它的基础知识、用例和一些提示和技巧。 什么是Kubernetes Job? Kubernetes job和cronjob是Kubernetes对象&#xff0c;主要用于短期和批处理工作负载。 kubernetes作业对象基本上部署了一个pod&…