C语言中有关 scanf( ) 函数和 gets( ) 函数以及getchar( )函数的一些使用细节
学过C语言的人都知道 scanf( ) 函数和 gets( ) 函数以及 getchar( ) 函数的作用,今天我们就来讲讲具体的细节,直接上代码:
1. scanf( )函数用来读取字符串:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100];
char str2[100];
char ch1;
char ch2;
scanf("%s", str1);
ch1=getchar();
gets(str2);
ch2=getchar();
printf("%s\n", str1);
printf("%d\n", ch1);
printf("%s\n", str2);
printf("%d\n", ch2);
system("pause");
return 0;
}
运行结果:
过程如下:
2. scanf( )函数用来读取字符
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20];
char str2[20];
char ch1;
char ch2;
int a;
int b;
scanf("%d/%d", &a, &b);
printf("a=%d,b=%d\n", a, b);
system("pause");
return 0;
}
正确运行结果:
错误运行结果:
这两者之间唯一的差别就是在12与16之间到底是用/分隔还是用空格分隔。我们发现在用空格分隔的时候能正确的读取12,但16就没法正确读取。原因就在于,scanf( )函数遇到空格,tab,回车这三者任何一个都会结束读取,所以16也就不能正确读取。但是如果你在输入数据之前就狂按回车,空格,tab键,那这个时候就不会结束读取,而是会在你输入数据之后遇到的空格,回车,tab键结束读取,所以scanf( )函数只有遇到输入数据之后输入的空格,回车,tab键才结束读取,这个有兴趣可以试试,在没开始输数据之前,你随便按空格,回车,tab键都没事。
还有一点就是scanf( )函数在读取完字符之后,未被读取的字符都会保存在键盘输入缓冲区中,包括回车,空格,tab键。
gets( )函数可以读取除回车键之外任意的字符,但不会保留回车键在键盘缓冲区中,而是把回车键(‘\n’)变成(‘\0’)。
还有就是scanf( )函数的返回值是一个整型(返回的是正确读取字符的个数),gets( )函数的返回值是一个指向已读取字符串首地址的指针。
建议:最好不要使用gets( )函数来读取输入的字符串,虽然gets( )函数能读取包含空格的字符串,但是需要注意的是gets( )函数它不会自己判断输入的字符是否达到了字符数组所能容纳的字符个数的上限,这就会导致数组越界,溢出等问题,所以不太建议使用gets( )函数来读取字符串。
这里介绍一种scanf( )函数的另一种使用方法:
如果需要用scanf( )函数来读取包含空格的字符串时,我们可以这么做:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20];
scanf("%[^\n]",str1);
printf("%s\n",str1);
system("pause");
return 0;
}
运行结果:
%[ ]表示读取任意的字符包括空格,回车,tab,也就是无限读取,无法结束,但如果是%[0-9]则表示数字0-9可以被读取,其他都不被读取,比如输入的是123456abcd,那么只能够读取123456,之后的数据就不能读取,留在缓冲区中。但如果输入abcd123456,那么scanf( )函数将直接结束读取,也就是啥也不读取。因为开头的字符不是0-9中的一个,所以直接结束读取,感兴趣的也可以去试试验证一下,我这里就不一一列举了。
而%[^\n]中的 ^ 表示非的意思,也就是除了回车(\n),其他任何字符我都可以读取,包括空格,tab。但是注意注意,回车符还是会保存在键盘缓冲区中的,强调很多次了,scanf( )函数不管输入什么都会保存在缓冲区中,只有被读取的字符才会被吞掉,之后剩下未被读取的字符会被保留在缓冲区中。
那%*[^\n]表示什么呢?
请看代码验证:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20]="Hello World!";
char str2[20]="Hello World!";
scanf("%*[^\n]",str1);
getchar();
gets(str2);
printf("%s\n", str1);
printf("%s\n",str2);
system("pause");
return 0;
}
运行结果如下:
这里我们输入的是aaa回车,接着输入bbb空格123回车。
结果str1还是之前的初始值,而str2由初始值变成了bbb 123.
这也就说明了%*[^\n]表示除了回车(\n)不被读取,其他输入的字符全部被读取,之后把这些读取的字符全部吞掉(清除),也就是不保留在输入缓冲区中,所以输入的aaa全部被吞掉(清除),但是回车符(\n)还是会保留在输入缓冲区中的。之后getchar( )吸收回车符,再接着gets( )读取输入的字符串,最终覆盖初始值。所以最后的结果就如图中所示。
我想讲到这里大家应该很清除scanf( )函数的使用细节了,以后遇到类似的问题自然就迎刃而解了,如果本文对你有帮助请记得点个赞,以后我也会分享更多关于C语言的知识,谢谢支持!