| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 462 人关注过本帖
标题:感觉C太奇怪,2个scanf函数,只用输入一次,这样很容易犯错误
收藏  订阅  推荐  打印 
yuyangtian1000
Rank: 2
等级:注册会员
帖子:84
积分:1022
注册:2008-5-30
感觉C太奇怪,2个scanf函数,只用输入一次,这样很容易犯错误

#include <stdio.h>
int main(void)
{
    char h;
    scanf("%c",&h);
    while(h!='g')
    {
        printf("%c",h);
        scanf("%c",&h);    
        
    }
    return 0;
}


输入GO jkhklkhg
就会发现只用输入一次
搞了很久看了C Primer Plus 才知道答案,嘎嘎有不同答案的说说
搜索更多相关主题的帖子: scanf  函数  感觉  输入  
2008-9-18 15:12
ml232528
Rank: 2
等级:注册会员
威望:1
帖子:172
积分:1910
注册:2007-7-23

你想说什么
while(h!='g')
你是怎么理解的

输入中有g就退出了

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-9-18 15:59
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

不要因为自己的无知而把责任推卸给别人:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int ch;
    while((ch=getchar()) != 'g' && ch != EOF)
        putchar(ch);
    return 0;
}

下面的也可以,但是不推荐,因为scanf在%c下行为特殊,比较容易被人误会:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char ch;
    while(scanf("%c",&ch) == 1 && ch != 'g')
        printf("%c",ch);
    return 0;
}

或者这样,这样虽然没有用到复杂的表达式,但是实现比较迂回,除非可以要显示最后的g,否则不推荐:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char ch;
    do
        putchar(ch = getchar());
    while (ch != 'g' && ch != EOF);
    printf("\b \b"); // 这行为了去掉最后的g
    return 0;
}

结论:你可以想出N种只有一个输入语句的书写程序的方法,可是为什么LZ还是用了最笨(不好意思应该不是最笨,因为肯定有更笨的)方法呢?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-9-18 16:43
yuyangtian1000
Rank: 2
等级:注册会员
帖子:84
积分:1022
注册:2008-5-30

这个不是我想出来的。这个是C Primer Plus 中的习题  希望版主也多看看书。
2008-9-18 17:36
hxlou520
Rank: 2
来自:中國_廈門
等级:注册会员
帖子:116
积分:1464
注册:2008-8-29

#include <stdio.h>
#define Y {char c;while(c=getchar()!='\n');}  /* 引用廣陵*/
int main(void)
{
    char h;
    scanf("%c",&h);
    while(h!='g')
    {
        printf("%c",h);
        Y;  /*清除鍵盤緩存*/
        scanf("%c",&h);   
        
    }
    return 0;
}

這樣也是可以的,不過這樣會比較麻煩點....

只要我用心,沒有不成功.
在學習中不斷失敗,必然是提高自己的一種手段.
2008-9-18 17:51
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

我没有C Primer Plus。

我看过这本书,是姐姐的。这本书的确讲得很细,书上写两个scanf是为了方便你理解。但是你不要以为书上面这么写,就说书上的是最好的!!

我记得一篇文章这么说的“在大陆程序员争相炫耀自己的代码遵守了什么什么标准的时候,国外的程序员却在想方设法把自己的习惯变成标准。”

学习计算机,教条主义是绝对绝对要不得的。无论你在做什么。

还有,如果你觉得奇怪,请说“那本书的教学方式很奇怪”,请不要说“C语言很奇怪”,你的说法就像是一个正在学习走路的小孩子说“大家干嘛要走阿,好奇怪,你看我爬得多好……”

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-9-18 17:54
woshiyun
Rank: 3Rank: 3
等级:中级会员
帖子:173
积分:2404
注册:2008-6-16

#define Y {char c;while(c=getchar()!='\n');}  /* 引用廣陵*/

不得不说一句,这种定义很有问题。
if()
  Y;
else
  X;
就是错误。
正确的是
#define Y do{...}while(0)
2008-9-18 17:55
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

hxlou520 在 2008-9-18 17:51 的发言:

#include
#define Y {char c;while(c=getchar()!='\n');}  /* 引用廣陵*/
int main(void)
{
    char h;
    scanf("%c",&h);
    while(h!='g')
    {
        printf("%c",h);
        Y;  /*清除鍵盤緩 ...
= =大哥你到底知不知道我们在讨论什么?
woshiyun 在 2008-9-18 17:55 的发言:

#define Y {char c;while(c=getchar()!='\n');}  /* 引用廣陵*/

不得不说一句,这种定义很有问题。
if()
  Y;
else
  X;
就是错误。
正确的是
#define Y do{...}while(0)
#define Y ....本身就是一个不好的习惯,对于“类函数”的宏,就算是没有参数也必须加一对小括号:

#define ClearInputBuffer() \
    do \
    { \
        int _ch; \
        while ((_ch = getchar()) != '\n' && _ch != EOF) \
            ; \
    } while(0)

[ 本帖最后由 StarWing83 于 2008-9-18 18:00 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-9-18 17:55
yuyangtian1000
Rank: 2
等级:注册会员
帖子:84
积分:1022
注册:2008-5-30

问题是偶是新手,我想学任何东西。都离不开模仿阶段,要模仿就要先学别人的规则。你说对不对???只有模仿编程老手后才能有在这个基础上创新吧!!!还有,这题我也认为有问题,所以我才提出来,让大家知道一下,会出现这个问题。并不是我认为是对的。还有我并不认为这本书的教学方式奇怪。因为scanf()这个函数切实是C里面的,并不会因为教程不同而不同。奇怪是因为这个函数容易造成错误。我以为作为一门计算机语言,这样容易造成错误的函数,应该改一改。

[ 本帖最后由 yuyangtian1000 于 2008-9-18 19:33 编辑 ]
2008-9-18 19:27
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

= =你觉得有人被这种错误给忽悠过么?

当然,改进是肯定有的,你可以试试看getchar,绝对不含糊。如果还不满意,可以使用C++的cin,这个要再不满意估计世界上就没有一个IO库可以让你满意了……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-9-18 21:10
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.186288 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved