C语言scanf函数处理机制及getchar机制

函数 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)函数:对于上面情况处理无效,还没能搞懂,此处保留。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值