| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1019 人关注过本帖
标题:关于scanf的bug
只看楼主 加入收藏
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
收藏
已结贴  问题点数:5 回复次数:6 
关于scanf的bug
#include <stdio.h>
int main()
{
    char str[1000];
    int i;
    for(i=0;;i++)
    {
    if(str[i]=='\r')
    break;
    scanf("%c",&str[i]);
    }
    printf("%s",str);
}[附件]2
搜索更多相关主题的帖子: include 
2017-01-28 17:38
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:5 
不明白你说的什么BUG。如果你说的是你的代码无法跳出循环的话,那么这样试试

#include <stdio.h>
int main()
{
    char str[1000];
    int i;
    for(i=0; ; i++)
    {
       scanf("%c",&str[i]);
       if(str[i] == '\n')
          break;
    }
    str[i] = '\0';
    printf("%s",str);
return 0;
}

[此贴子已经被作者于2017-1-28 18:34编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-28 18:20
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
弄错了编辑掉。

[此贴子已经被作者于2017-1-28 18:26编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-28 18:24
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 2楼 renkejun1942
多谢你的回帖,但我有两个问题
1;为什么把回车键当字符时不是当作'\r',而是’\n'?
2:使用scanf函数时,按enter结束输入时,'\n'究竟有没有也当作一个字符输入电脑。即按下enter时,是否同时产生两个操作,终止输入和输入字符'\n'

............
2017-01-28 19:22
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 邹特强
以你的代码为例。
scanf("%c",str[i]);

当你输入一个字符,然后按下回车,这个字符和回车都会被储存在缓冲区,字符被传递给str[i](缓冲区删除该字符),但是回车依旧会留在缓冲区中,这样下一个str[i]就会接受到回车。

所以在进行字符输入的时候,要特别小心多出来的一个回车,可以用以下代码避免多出来的回车造成不必要的麻烦:

该代码有两行,别漏了那个分号。目的是接受缓冲区内多余的字符,并将其抛弃。
while(getchar() != '\n')
;

当然你也可以用更简单的办法清空缓冲区——fflush(stdin).

至于\n和\r有什么区别,我说不好,但它们的确是有区别的,你可以自己搜索下。

[此贴子已经被作者于2017-1-28 20:24编辑过]

收到的鲜花
  • qdcs2017-01-29 14:33 送鲜花  5朵   附言:我很赞同

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-28 20:15
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 5楼 renkejun1942
谢谢您的回答,您的回答很专业。但请问fflush(stdin).具体怎么用?以我这个程序为例。

............
2017-01-29 19:32
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 6楼 邹特强
fflush(stdin)清空输入缓冲区。

fflush()是清空缓冲的函数。

[此贴子已经被作者于2017-1-29 21:42编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-29 21:38
快速回复:关于scanf的bug
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038047 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved