函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
其调用格式为: scanf(“<格式化字符串>”,<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
格式字符串包括三种字符“格式化符“,如”%d,%c,%s”等;”空白符”,如空格,制表符,新行符;”非空白符”,如”,”等。
空白符:空白字符会使scanf函数在读操作中略去输入中的一个或多个空白字符。
非空白符:一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
如:scanf(“%d%d”,&a,&b);
或scanf(“%d %d”,&a,&b); 输入时: 1 2
scanf(“%d,%d”,&a,&b); 输入时:1,2
关键:在用格式化符%c时,空格,转义符均为有效字符;
例:scanf(“%c%c%c”,&a,&b,&c);
输入:a□b□c
则:a=’a’,b=’□’,c=’b’
实际遇到的问题:
int main()
4 {
5 char a,b;
6 scanf("%c",&a);
7 scanf("%c",&b);
8 printf("%c %c",a,b);
9 return 0;
10 }
gdb调试:
6 scanf("%c",&a);
(gdb) n
a
7 scanf("%c",&b);
(gdb) n
8 printf("%c %c",a,b);
(gdb) p a
$1 = 97 'a'
(gdb) p b
$2 = 10 '\n'
当输入完a的值后,回车也被b接受,在实际运行输入完a就直接打印a结束。
优化:
int main()
4 {
5 char a,b;
6 scanf("%c",&a);
7 getchar();
8 scanf("%c",&b);
9 printf("%c %c",a,b);
10 return 0;
11 }
在scanf前加上getchar();
6 scanf("%c",&a);
(gdb) n
a
7 getchar();
(gdb) n
8 scanf("%c",&b);
(gdb)
b
9 printf("%c %c",a,b);
(gdb) n
10 return 0;
(gdb) p a
$1 = 97 'a'
(gdb) p b
$2 = 98 'b'
百度百科getchar机制:
当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
fflush(stdin)函数:对于上面情况处理无效,还没能搞懂,此处保留。