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

不指定 penguinol ,Jun 17 02:03 , 计算机&网络 » 互联网技术 , 评论(1) , 引用(0) , 阅读(287) , 本站原创 | |
scanf()实在不是一个令人喜欢的函数;

今天在写课程设计作业的时候,遇到了一个问题:
代码如下:
scanf("%d",&a);
gets(b);

然后输入:1 回车
当代码写成这样的时候,gets()就会被直接跳过。
把代码改成这样:
scanf("%d",&a);
gets(b);
printf("%d",b[0]);

发现输出的b[0]的值为0,ASCII码里0代表的是空字符,即字符串的结束。
也就是说scanf把回车当成空字符读进去了。

为了解决这个问题,尝试把代码改成这样:
scanf("%d\n",&a);
gets(b);

发现gets()能正常读入键盘内容了。

但是又遇到一个新问题,当代码写成这样的时候
scanf("%d\n",&a);
printf("%d",a);
gets(b);

不管你按几个回车,也执行不到printf("%d",a);,程序卡住了,直到你随便输一个字符,才能跳过,但gets()又没用了。

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

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



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

scanf("%d\n",&a);
fflush(stdin);
printf("%d",a);
gets(b);

Tags: , , ,
c
2010/06/27 12:07
“ASCII码里0代表的是空格”?
不是吧,明明是字符串的结束符。。
就是说,b是空字符串""。
penguinol 回复于 2010/06/27 17:57
抱歉,笔误,应该是空字符
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]