问题一: 使用scanf 和 getchar()函数读取字符 先来看两个简单的程序,用来读字符,并且输出:
#include <stdio.h>int main(){ char ch1,ch2; scanf("%c",&ch1); scanf("%c",&ch2); printf("%d %d\n",ch1,ch2); // 或者:// char ch3,ch4;// ch3 = getchar();// ch4 = getchar();// printf("%d %d\n",ch3,ch4); return 0;}
程序的本意是从键盘输入两个字符,并打印相应的ASCII码,但是运行后回发现,当输入a回车后并不会提示继续输入第二个字符,而是直接输出 97,10 。
分析: 程序的输入都有一个缓冲区,即输入缓冲区,当由键盘输入是会将输入的内容放入输入缓冲区,c程序直接从输入缓冲区读数据,所以当缓冲区中有残留数据时,程序并不会提示继续输入,而是直接取走缓冲区残留的数据。scanf和getchar读取缓冲区的数据,当输入a并回车后,其实'a'和’\n'都会存入内存缓冲区,所以第一次读取'a'被取走,剩下的‘\n'被第二次取走,输出的10恰好是'\n'的ASCII值。
问题二:使用scanf读取字符串 先看程序: #include <stdio.h>int main(){ char ch1[20],ch2[20]; scanf("%s",ch1); printf("%s\n",ch1); scanf("%s",ch2); printf("%s\n",ch2); /* char *ch3,*ch4; scanf("%s",ch3); printf("%s\n",ch3); scanf("%s",ch4); printf("%s\n",ch4); */ return 0;}
分析: 程序功能是读取字符串并输出,这是可以实现的,前提是字符串中间不能有空格或者tab,因为scanf函数是遇到空格、tab、回车停止读取,比说说,我们输入ab cd, 第一个scanf会去读ab,而cd还在缓冲区中,第二个scanf就会读取cd,而不是要求用户继续输入。 P.S. 虽然定义字符串也可以用指针的方法,但是这里如果用指针定义,程序不会正确执行,原因不清楚。所以我注释的程序是由问题的。
问题三:使用gets()读取字符串 上面的程序,我们把scanf改成gets()来看一下执行结果: #include <stdio.h>int main(){ char ch1[20],ch2[20]; gets(ch1); printf("%s\n",ch1); gets(ch2); printf("%s\n",ch2); return 0;// 输入:hello world// 输出:hello world// 输入:world piece// 输出:world piece}
分析:程序结果与scanf显然不同,当输入带有空格的字符串,程序照样会正确读取,所以当我们需要需要带有空格的字符串是,可以选择使用gets()方法; P.S. scanf()函数同样可以实现读取带空格的字符串,格式是scanf("%[^'\n']); (什么意思,不清楚)
总结: scanf: 以空格、tab、 回车结束一次读取,不会舍弃最后的回车符; getchar(): 以enter结束输入,也不会舍弃回车符; get(): 以Enter结束,接收空格,舍弃回车符;
避免出现问题:需要清空一下缓冲区的残留数据: 我知道的是rewind(stdin); 使用方法:在第一次读取语句后加rewind(stdin)即可清除上次读取结束后残留的缓冲区数据;
|