解题思路:

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

       思路:

       一、在主函数中输入字符串、输出统计结果。所以此处考虑用一个字符串数组(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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论