问题:
对于我这种C语言菜鸟程序员来说,一碰到输入第一想到的就是scanf,正是因为这样在scanf里吃了很多亏。好吧,这里帮自己总结一下:
函数原型:
1
|
int
scanf
(
const
char
*format, ... );
|
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
其调用格式为: scanf("<格式化字符串>",<地址表>);
1.问题一 本意是想输入两个字符,然后显示出来,结果输入G,然后回车,再想输入下一个字符时,程序运行结束。
#include <stdio.h>
int main()
{
char ch1, ch2;
scanf("%c", &ch1);
scanf("%c", &ch2);
printf("%d %d\n", ch1, ch2);
return 0;
}
结果可以看到ch1吸收了G,ch2吸收了回车。
changjin.tong@sajs151-Veriton-M288:~$ ./scanf
G
G,
changjin.tong@sajs151-Veriton-M288:~$
2.问题二 把格式化从%c改为%s,结果就不一样了。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch1[10],ch2[10];
scanf("%s",ch1);
scanf("%s",ch2);
printf("%s,%s\n",ch1,ch2);
return 0;
}
结果:
changjin.tong@sajs151-Veriton-M288:~$ ./scanf
GG
MM
GG,MM
changjin.tong@sajs151-Veriton-M288:~$
总结:
1.程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区。
2.接收字符时,回车也会被送到输入缓冲区,被获取缓冲区字符的函数取走。
3.接收字符串时空格,与回车都是\0。
很牛的做法:scanf("%[^\n]",ch);加入正则表达式,这样就方便了很多想用回车来区分不同输入的程序员了。