题目:编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息
很好,这几把题目,和上文的不含空格一样,加大了难度(没有提示信息)
既然要识别空格键,那就不可避免要用到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语句,只得到结果,为了做题得分
Comments NOTHING