10.24 接上文 关于strcmp函数和fgets函数主要事项

发布于 2024-10-24  217 次阅读


题目:编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息

很好,这几把题目,和上文的不含空格一样,加大了难度(没有提示信息)

既然要识别空格键,那就不可避免要用到fgets函数,但是,你是要通过回车键来退出fgets的,所以,你得用到if语句

// 读取输入直到遇到空行 while (1)  
{ fgets(str, sizeof(str), stdin); 
 if (strcmp(str, "\n") == 0) { // 检查是否是空行 break; }

给我把这块代码中的strcmp给去掉,按回车键fgets就会退出输入!

是的,fgets() 函数在读取输入时会一直读取,直到遇到换行符(即回车键产生的\n字符)或者达到指定的字符数限制。当 fgets() 读取到换行符时,它会停止读取并将读取到的字符串(包括换行符)存储在目标字符数组中(做两件事!)。因此,你可以使用 fgets() 来读取用户输入的一行文本,并在用户按下回车键时停止读取。

还是那句话,这个题目没必要用动态分配,因为不让你加提示信息,用了也是画蛇添足


这里又扯出了继strcpy,strlen之后的新的存在于string.h头文件里的strcmp函数(它们的作用对象都是字符串,即字符数组)

strcmp函数用于比较两个字符串的内容,并返回一个整数值

strcmp(const char *str1, const char *str2);

返回值

  • 小于 0:如果 str1 小于 str2(按字典顺序比较)。
  • 等于 0:如果 str1 等于 str2
  • 大于 0:如果 str1 大于 str2

就相当于两个相减后的值的正负

//解释:比如,当第一个不同的字符的 ASCII 值小于第二个字符串对应字符的 ASCII 值),则返回一个负值(随机的负值)

strcmp 函数会(操你妈,傻逼ai)地比较两个字符串,直到找到不同的字符或遇到字符串的结束符(空字符 \0草泥马,傻逼chatgpt

这就是strcmp函数的功能,记住就行


fgets 会读取换行符,如果输入的字符串以换行结束,换行符也会被计入字符统计中,可能会影响 other 的计数

最简单就是使用if最后的else判断条件改成str[ i ]!='\n'

字符串结束符fgets 会在读取的字符串末尾自动添加 '\0',以标识字符串的结束。但是,strlen是不会将他归为真实字节

第二个方法就是抛弃strlen(str)最后一个(必定是\n),使用i<strlen(str)-1


在 C 语言中,fgets 函数的第二个参数指定了要读取的最大字符数,包括换行符和字符串结束符 \0如果你将第二个参数设置为 9,那么 fgets 会读取最多 8 个字符(留一个位置给 \0),并在遇到换行符(即回车键)时停止读取


再补充一下数组下标的知识,字符串结束符'\n'单引号就行了,它是会占一个位置的,所以正常应该是str[里面要加1,即使是从下标0开始],如果就当[ ]里面是真实字符个数,就会丢失\0,(不过我感觉这样甚至更好,haha)

如果你单独用引号赋值不加上'\n',也会丢失\0

最后一个元素的下标:对于一个大小为 n 的数组,最后一个元素的下标是 n - 1,而不是 n

输入1个正整数n,在输入n个字符,分别统计其中英文字母、空格或回车、数字字符和其他字符的个数,c语言

这次要回车,直接用字符ch,用循环里面的ch=getchar();加if语句,只得到结果,为了做题得分

届ける言葉を今は育ててる
最后更新于 2024-11-07