| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2582 人关注过本帖, 2 人收藏
标题:感觉C太奇怪,2个scanf函数,只用输入一次,这样很容易犯错误
只看楼主 加入收藏
yuyangtian1000
该用户已被删除
收藏(2)
 问题点数:0 回复次数:13 
感觉C太奇怪,2个scanf函数,只用输入一次,这样很容易犯错误
提示: 作者被禁止或删除 内容自动屏蔽
搜索更多相关主题的帖子: scanf 函数 感觉 输入 
2008-09-18 15:12
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
收藏
得分:0 
你想说什么
while(h!='g')
你是怎么理解的

输入中有g就退出了

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-18 15:59
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
不要因为自己的无知而把责任推卸给别人:

#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-09-18 16:43
yuyangtian1000
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-09-18 17:36
hxlou520
Rank: 1
来 自:中國_廈門
等 级:新手上路
帖 子:116
专家分:0
注 册:2008-8-29
收藏
得分:0 
#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-09-18 17:51
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
我没有C Primer Plus。

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

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

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

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

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 17:54
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
#define Y {char c;while(c=getchar()!='\n');}  /* 引用廣陵*/

不得不说一句,这种定义很有问题。
if()
  Y;
else
  X;
就是错误。
正确的是
#define Y do{...}while(0)
2008-09-18 17:55
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]hxlou520[/un] 在 2008-9-18 17:51 的发言:[/bo]

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



= =大哥你到底知不知道我们在讨论什么?

[bo][un]woshiyun[/un] 在 2008-9-18 17:55 的发言:[/bo]

#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)

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

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 17:55
yuyangtian1000
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-09-18 19:27
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
= =你觉得有人被这种错误给忽悠过么?

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

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 21:10
快速回复:感觉C太奇怪,2个scanf函数,只用输入一次,这样很容易犯错误
数据加载中...
 
   



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

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