关于scanf()和 的种种恩怨。

scanf()实在不是一个令人喜欢的函数;

今天在写课程设计作业的时候,遇到了一个问题:
代码如下:
[mycode=c]scanf(“%d”,&a);
gets(b);[/mycode]
然后输入:1 回车
当代码写成这样的时候,gets()就会被直接跳过。
把代码改成这样:
[mycode=c]scanf(“%d”,&a);
gets(b);
printf(“%d”,b[0]);[/mycode]
发现输出的b[0]的值为0,ASCII码里0代表的是空字符,即字符串的结束。
也就是说scanf把回车当成空字符读进去了。

为了解决这个问题,尝试把代码改成这样:
[mycode=c]scanf(“%d\n”,&a);
gets(b);[/mycode]
发现gets()能正常读入键盘内容了。

但是又遇到一个新问题,当代码写成这样的时候
[mycode=c]scanf(“%d\n”,&a);
printf(“%d”,a);
gets(b);[/mycode]
不管你按几个回车,也执行不到printf(“%d”,a);,程序卡住了,直到你随便输一个字符,才能跳过,但gets()又没用了。

大致原因如下:当我们按下”Enter”键时,会向键盘缓冲区发去一个回车‘\r’和一个‘\n’
但在这里‘\r’被scanf()函数给处理掉了,而‘\n’被scanf()函数“错误”地赋给了程序。

那么究竟怎么解决呢,推荐以下两种方法:
在scanf()后加入getchar()
[mycode=c]scanf(“%d\n”,&a);
getchar();
printf(“%d”,a);
gets(b);[/mycode]

使用函数fflush

函数名: fflush
功 能: 清除一个流
用 法: int fflush(FILE *stream);

[mycode=c]scanf(“%d\n”,&a);
fflush(stdin);
printf(“%d”,a);
gets(b);[/mycode]

1 comment — post a comment

c

“ASCII码里0代表的是空格”?
不是吧,明明是字符串的结束符。。
就是说,b是空字符串""。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注