解题思路:
原题:编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。
思路:
一、在主函数中输入字符串、输出统计结果。所以此处考虑用一个字符串数组(str[])用来存储字符串信息,一个整形数组(count[4])用来存储统计的个数。count[4]中count[0]、count[1]、count[2]、count[3]的值分别对应字母、数字、空格和其它字符的数量。
二、在主函数中输入字符串,将两个数组作为参数传递给自定义的函数,用循环遍历字符串数组,并用if...else if...else if...else...判断字符类型,统计各种字符的数量存入数组count。
三、在主函数用for循环顺序输出count各元素的值,别忘了用空格隔开。
注意事项:
在判断字符类型时,注意循环的循环条件。若使用的是for循环,可以选择两种循环条件:(1)for (int i = 0; str[i] != '\0'; i++) 字符串数组中,最后一个字符是'\0',但它不属于我们的统计范围。(2)for (int i = 0; i < strlen(str); i++) 用strlen()函数获取字符串长度,然后遍历。若选择的是while循环,可选择str[i] != '\0'作为循环条件。
题外话:
关于输入字符串的函数,在本例中使用的是gets()。其实在最开始,我是选择fgets()来输入字符串的。原因:这里是参考这个博客来选择的(C语言中gets_s(),gets(),fgets()函数的比较。_hunzhizi的博客-CSDN博客_gets_s)
(1)gets()函数不会检查函数边界,输入多少读多少,直到碰到换行符(回车)才会将换行符以外的信息存入字符串,容易造成缓冲区溢出。
(2)fgets()函数的输入参数中,通过第二个参数指明了字符串的最大长度,到达最大长度时,即使没有读到换行符也会停止读取,可以解决溢出问题,比gets()函数安全。
这两个函数都是在碰到换行符时结束读取,但是gets()函数不保留换行符,而fgets()函数会将换行符储存在字符串中。也就是说,gets()函数获取的字符串末尾是'\0',而fgets()函数获取的字符串的末尾是'\n'、'\0',若使用fgets()来完成本题的话,循环的循环条件就是str[i] != '\n'。
我一开始就是按照这个想法,用fgets()函数来解题,我自己调试运行得到的结果是正确的,但是提交之后的答案都有错。我自己还没想清楚原因,(代码放在最后)如果哪位知道这是什么原因的话,还请指点一下,谢谢!!!
参考代码:
#include#include#define MAX 100 void CharType(char str[],int count[]) { for (int i = 0; str[i] != '\0'; i++) { if ( str[i] >= 'a'&& str[i] = 'A' && str[i] = '0' && str[i] <= '9') { count[1] += 1; } else if(str[i] == ' ') { count[2] += 1; } else { count[3] += 1; } } } int main() { char str[MAX]; int count[4] = {0}; gets(str);//键盘获取字符串 CharType(str,count);//判断字符类型、统计个数 for(int i=0; i<4; i++) { printf("%d ", count[i]); } return 0; }
用fgets()函数解题的代码 (提交之后的结果是答案错误,求解惑!) :
#include#include#define MAX 100 void CharType(char str[],int count[]) { for (int i = 0; str[i] != '\n'; i++) { if ( str[i] >= 'a'&& str[i] = 'A' && str[i] = '0' && str[i] <= '9') { count[1] += 1; } else if(str[i] == ' ') { count[2] += 1; } else { count[3] += 1; } } } int main() { char str[MAX]; int count[4] = { 0 }; /*键盘获取字符串*/ fgets(str, MAX, stdin); /*判断字符类型、统计个数*/ CharType(str, count); /*输出统计结果*/ for (int i = 0; i < 4; i++) { printf("%d ", count[i]); } return 0; }
0.0分
0 人评分
蓝桥杯历届试题-九宫重排 (C++代码)浏览:2812 |
简单的a+b (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:683 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:561 |
敲七 (C语言代码)浏览:2747 |
1052题解(链表操作)浏览:782 |
1134题解(求分析)浏览:795 |
C语言训练-排序问题<1> (C语言代码)浏览:369 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:827 |
1250题解浏览:603 |