1,getchar()-字符输入函数,没有参数,从输入缓冲区里面读取一个字符 - 「 一次只能读取一个字符 」常常与putcha()函数配合使用。
如果想要读取这串字符中的字母、空格、数字、其他字符的个数,我们的思路首先想的是getchar()这个函数可以从缓冲区一次读取一个字符。当我们输入一串字符时,可以使用while()循环,使gerchar()函数依次读取完输入的所有字符,直到读取到字符结束标志'\0'时,循环结束,所以while()循环里面的判断条件为(getchar() != '\0')。
下面使用VS2022编译了一段代码供大家参考:
#include <stdio.h>//5.实验内容第一题,判断特定字符个数
int main()
{
char x;//定义字符串x
int a = 0, b = 0, c = 0, d = 0;
printf("请输入一串字符:\n");
while ((x = getchar()) != '\n')
{
if (x >= 'a' && x <= 'z' || x >= 'A' && x <= 'Z')
a++;//字母计数器
else if (x == ' ')
b++;//空格计数器
else if (x >= '0' && x <= '9')
c++;//数字计数器
else
d++;//其他计数器
}
printf("字母a=%d 空格b=%d 数字c=%d 其他d=%d\n",a,b,c,d);
}
2,
1.数组:储存数据类型相同的一系列元素
例如 int a[100]; 在这里a数组储存100个int型元素,在这里 [] 这个符号就是告诉计算机 a 是一个数组。
值得一提的是数组的下标访问数组的,数组中的a[0] 一般表示你初始化的第一个值。
在 C 语言中,除了整型、实型和字符型等基本数据类型之外,还可以将基本数据类型按照一定的规则组合起来构成较为复杂的数据类型,称为构造数据类型,又称导出数据类型,主要包括数组、结构体、共用体等。数组中顺序存放了一批相同数据类型的数据,这些数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素。通过数组名标识和序号(C 语言称为下标)可以引用这些数组元素。
数组是一组有序的数据的集合--数组中的元素类型相同,并由数组名和下标唯一地确定。
1. 数组名代表数组的起始地址,是地址常量。
2. 数组元素在内存中是连续存储的。
3. 引用数组元素:数组名[下标],下标从0开始
特别注意的是,每个数组中都包含一个结束字符'\0',用来结束字符的读取。
在这个题中,我们的思路就是,首先定义一串数组用来存放我们输入的这一串字符,然后运用gets函数读取这一串字符中的每个字符,用来判断是空格,数字,字母,还是其他字符。剩下的思路与第一种使用getchar()函数来解决的思路是相同的。
特别注意的是,为什么不用scanf()函数呢?,相信你认真读到这以后肯定会有一个疑问,为什么用gets()函数缺不用我们常见的scanf()函数。下面我就给大家解释一下这两个函数的区别:
gets与scanf输入字符串的方式也非常类似,但是有几个区别:
(1) gets的输入分割符只有回车,因此gets是能够读入空格的。如果输入为"hello world"时,上面程序的运行结果是"hello world"。而如果用scanf则只能输出hello
(2) 此外,scanf和gets对待缓冲区里的回车符也是完全不同的。scanf在读取非空白符之前会忽略回车,读取之后如果遇到空白字符会停止输入,将其留着缓冲区里;gets只要一遇到回车就输入结束,并把这个回车从缓冲区里移走。
(3) gets可以读取空回车,但是scanf不能。
例如输入为"\nhello\n",也就是说,先输入一个空行,然后在第二行输入"hello"并回车。scanf按照它的读取原理,把第一个’\n’作为空白符忽略掉,然后读取字符串"hello",遇到第二个’\n’时输入结束,但是第二个’\n’会被scanf残留在缓冲区里。scanf的输入结果是读入字符串"hello"。当用gets进行读取时,它遇到第一个’\n’,就找到了它的输入分隔符,停止继续输入,第一个’\n’被从缓冲区中读走了,缓冲区里剩下"
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
需要注意的是,调用gets函数是库函数,使用需要添加头文件#include<string.h>
下面使用VS2022编译了一段代码供大家参考:
#include<stdio.h>//5.实验内容第一题,判断特定字符个数(数组方法)
#include<string.h>
int main()
{
int a = 0, b = 0, c = 0, d = 0;//设置四个计数器
char arr[100];
printf("请输入一串字符:");
gets_s(arr);
for (int i = 0; i <= strlen(arr)-1; i++)//判断值为字符串末编号
//如果使用sizeof()需要-2 ,sizeof和strlen的区别我上个文章有提到。
{
if (arr[i] == ' ')
a++;//a为空格计数器
else if (arr[i] >= 'A' && arr[i] <= 'Z' || arr[i] >= 'a' && arr[i] <= 'z')
b++;//b为英文字母计数器
else if (arr[i] >= '0' && arr[i] <= '9')
c++;//c为数字计数器
else
d++;//d为其他计数器
}
printf("输出的空格%d 英文%d 数字%d 其他字符个数分别为%d :", a, b, c, d);
return 0;
}
以上两种方法,getchar()函数与数组的效率是下相差不大的,前者是利用getchar()函数一次只能读取一个字符,while()循环依次读取完。后者是一次性把字符串全部读取完,利用for循环根据字符串下标依次进行判断。我的建议是利用getchar()函数来解决该问题,因为思路比数组简单的多,更容易理解和接受。
以上就是我对这道题的解答,和思路规整,希望对正在学习C语言的你有所帮助。
本人能力有限,如有不足,敬请各位读者指正!