【转载】深入了解scanf()/getchar()和gets()等函数,C++系列教程,C++实例教程,C++
---------首先我们看一下scanf()读取字符串的问题:
程序2:
程序的功能是读入一个字符串输出,再读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:
测试一: Hello world! 输出: Hello world! 【分析】
到此程序执行完毕,不会执行第二次的读取操作!这个问题的原因跟问题一类似,第一次输入Hello world!后,字符串Hello world!都会被读到输入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,也就是第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。
测试二:
Hello[Enter] Hello[输出] world[Enter] world[输出] 【分析】
程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()读取字符串会舍弃最后的回车符!
我们再看一下gets()读取字符串的情况: 用scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会被舍弃从而残留在缓冲区中。其实有另外一个函数是可以接受空格的,那就是gets(),下面我们看一下这个函数的应用,我们把程序2改动一下: 程序3:
测试: Hello world! [输入] Hello world! [输出] 12345 [输入] 12345 [输出] 【分析】
显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个字符串取了Hello world! 接受了空格符,而没有像上一个程序那样分成了两个字符串!所以如果要读入一个带空格符的字符串时应该用gets(), 而不宜用scanf()!
-------------------------------------------------------- | 问题描述三:(getchar()暂停程序,查看程序执行结果)| -------------------------------------------------------- 不知道大家有没有遇到过这样的问题,有的编译器程序执行完后的结果界面不会停下而是一闪就没了,以至于看不到执行结果。所以很多人在程序最后加上getchar()语句,目的是想让程序执行完后停下来,等待从终端接收一个字符再结束程序。可是发现有时候这样根本没用,程序照样跳出去了。这是为什么呢? 【分析】
原因跟上面例子讲的一样,是因为输入缓冲区中还有数据,所以getchar()会成果读到数据,所以就跳出了!
------------------
| 【总结】 | ------------------ 第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题! 读取字符时: scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中); getchar()以Enter结束输入,也不会舍弃最后的回车符; 读取字符串时: scanf()以Space、Enter、Tab结束一次输入 gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符! 第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决: 再转一篇~~~
请告诉我是什么“道理”
scanf读取时 是遇到空格就停止读取!也就是说 如果你键入得是harry potter 那么实际上scanf只能获取harry这个单词 后面的“ potter”会在停在输入流中那么你就要最少要加9个getchar(一个空格 6个单词字母 一个换行符还有一个待输入光标)才能看到运行结果
用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。
为了避免这种情况,可多设几个字符数组分段存放含空格的串。 想知道谁在起作用很简单,因为你输入几个单词的时候,发现只有第一个单词能够显示出来,猜想scanf(%s)提取字符窜的条件是Enter(换行--输入结束)或者Space(空格),而且还可以做个极端的测试,就你一开始只输入换行或者空格,发现程序永远不会执行printf,而只要我们输入一窜连续字符+一个空格之后,不论我们输入什么,Enter之后,printf执行完之后都是一开始的一窜连续字符,因此我们还可以知道,scanf(%s)提取完成的语句格式是一开始遇到的一连窜字符;而由于执行getchar(),之前printf输出的是scanf所提取的字符窜,而之后的字符或者空格包括回车将会被getchar()调用,其实你的程序两个getchar()的作用只相当于一个getchar()的作用,因为第一个只不过读取的是回车符,也就是你输入一个字符窜之后的回车键而已;因此当你输入几个用空格隔开的字符窜的时候,无用的getchar()的个数应该等于(回车数)1+n1(空格数)+n2(除第一个连续有形字符窜的其他字符数);所以当你输入两个甚至几个名字的时候,getchar()是远远不够用的;
|