C语言中scanf()/getchar()和gets()输入问题集锦
一、连续 scanf() 和 getchar() 输入问题
当定义为:
[code]char ch1, ch2; scanf("%c", &ch1); scanf("%c", &ch2); 或 char ch1, ch2; ch1 = getchar(); ch2 = getchar();
我们可以实践得出,当输入一个数ch1 = ‘a’的时候,第二个输入会跳过。同时,输出ch1为97,而ch2在没有输入值的情况下,输出为10。
原因:
首先我们呢看一下输入操作的原理, 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中 取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子 中为什么会出现输入语句失效的原因!
其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读 取时遇到回车(/n)而结束的,这个/n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符/n,这样第二次的读入函数直接从缓冲区中 把/n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!
二、scanf() 函数取数据是遇到回车、空格、TAB就会停止,因此不能连续输入。一旦出现空格,后面的数据就会舍弃残留在缓冲区中。其实有另外一个函数是可以接受空格的,那就是gets() 函数
三、gets()函数
[code]char str1[20], str2[20]; gets(str1); printf("%s/n",str1); gets(str2); printf("%s/n",str2);
小结:
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入,舍弃最后的回车符。
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
scanf("%[^/n]",string);
- 学习c语言遇到的一些问题(3)(Linux)(getchar()和gets()重点:scanf产生的回车符问题)
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- 深入解析scanf()/getchar()和gets()等函数针对字符串输入的问题
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- c语言的输入scanf、getchar、gets解析
- C语言字符数组的输入与输出:scanf,printf,getchar,putchar,gets使用方法
- 深入解析scanf()/getchar()和gets()等函数针对字符串输入的问题
- C语言有关于输入字符或字符串中getchar,gets,scanf的区别
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- 总结:C语言字符串输入的三种方式(scanf("%c",array); scanf("%s",str); gets(array);)
- C语言中,保证输入输出的正确:scanf(),scanf_s(), gets(), getchar()
- 【C语言】最通俗易懂地讲解scanf、gets和getchar的区别(相信我,看了一定懂!!!)
- C语言输入中对scanf和gets的讨论
- 第九课 C语言的输出输入scanf,getchar,printf,putchar
- c语言获取用户输入字符串是scanf和gets的区别
- C语言中scanf函数输入回车符的问题
- scanf(“%s",)与gets()输入字符串的区别,以及与getchar()吸收回车键的搭配
- C语言中scanf函数输入回车符的问题
- c语言获取用户输入字符串是scanf和gets的区别
- gets和scanf区别,使用gets输入经常出现一闪而过的问题