免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3710 | 回复: 12
打印 上一主题 下一主题

[C] 有奖纠错。。。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-11 13:01 |只看该作者 |倒序浏览
30可用积分
这段简化的代码,输出应该只有103, 104, 105三种,
结果怎么都不对。
昨天花一个晚上才查出这个问题,真是太不可饶恕了。
大家看看,第一个找出问题的加30分


  1. #include <stdio.h>
  2. #include <string.h>

  3. int some_func()
  4. {
  5.         return 100;
  6. }

  7. typedef enum
  8. {
  9.         CHOOSE_NOBODY = 3,
  10.         CHOOSE_TOM = 4,
  11.         CHOOSE_JERRY = 5
  12. } CHOOSE_E;

  13. int main( int argc, char **argv )
  14. {
  15.         CHOOSE_E choice;
  16.         int action;
  17.        
  18.         if( argc != 2 )
  19.         {
  20.                 fprintf( stderr, "Wrong arguments\n" );
  21.                 return 1;
  22.         }

  23.         if( strcmp( argv[1], "tom" ) == 0 )
  24.                 choice = CHOOSE_TOM;
  25.         else if ( strcmp( argv[1], "jerry" ) == 0 )
  26.                 choice = CHOOSE_JERRY;
  27.         else
  28.                 choice = CHOOSE_NOBODY,

  29.        
  30.         /* Assisn the variable action
  31.            and print it
  32.          */
  33.         action = some_func( ) + choice;

  34.         printf( "action = %d\n", action );

  35.         return 0;
  36. }
复制代码

[ 本帖最后由 飞灰橙 于 2008-7-11 13:55 编辑 ]

最佳答案

查看完整内容

choice = CHOOSE_NOBODY,成逗号表达式了。

论坛徽章:
0
2 [报告]
发表于 2008-07-11 13:01 |只看该作者
choice = CHOOSE_NOBODY,

成逗号表达式了。

论坛徽章:
0
3 [报告]
发表于 2008-07-11 13:11 |只看该作者
楼上够快,我看了N久

估计楼上是正确答案了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-07-11 13:21 |只看该作者
还有一个问题
strcmp( argv[0], "tom")

argv[0] 不是程序名称吗.. 这应该不是你的本意吧.

论坛徽章:
0
5 [报告]
发表于 2008-07-11 13:22 |只看该作者
主要原因还是逗号

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
6 [报告]
发表于 2008-07-11 13:24 |只看该作者
strcmp( argv[0], "tom" ) == 0
程序编译成tom了吗?

论坛徽章:
0
7 [报告]
发表于 2008-07-11 13:24 |只看该作者
呵呵,大意所致,往往这种问题,你越找越找不着!

论坛徽章:
0
8 [报告]
发表于 2008-07-11 13:27 |只看该作者
这种问题很容易找。随便用个好点的编辑器,比如emacs,你会发现
    action = some_func( ) + choice
这句话对齐不对劲,仔细看看就发现上面是个逗号而不是分号了。

论坛徽章:
0
9 [报告]
发表于 2008-07-11 13:47 |只看该作者
LZ不是用的Vim C加亮吧?

论坛徽章:
0
10 [报告]
发表于 2008-07-11 13:52 |只看该作者

我实际做了一下

楼主给我们这个程序的时候一定是有些地方写错了


#include <stdio.h>
#include <string.h>

int some_func()
{
        return 100;
}

typedef enum
{
        CHOOSE_NOBODY = 3,
        CHOOSE_TOM = 4,
        CHOOSE_JERRY = 5
} CHOOSE_E;

int main( int argc, char **argv )
{
        CHOOSE_E choice;
        int action;

        if( argc != 2 )
        {
                fprintf( stderr, "Wrong arguments\n" );
                return 1;
        }


        //楼主的初衷应该是要比较命令行的第二个参数是不是"tom"或"jerry",而argv[1]才代表第二个参数,所以这里if,else中的比较都应该是针对argv[1]进行的,而argv[0]是编译后的可执行文件名
        if( strcmp( argv[1], "tom" ) == 0 )
                choice = CHOOSE_TOM;
        else if ( strcmp( argv[1], "jerry" ) == 0 )
                choice = CHOOSE_JERRY;
        else
                choice = CHOOSE_NOBODY;
                //这里原来是“,”,我想楼主原来的程序应该是“;”,如果不是,那这算一处错误,如果这里是逗号,那么 choice = CHOOSE_NOBODY,action = some_func( ) + choice; 形成一个逗号表达式,所以如果执行到这里choice值是3,action值是100+3=103


        /* Assisn the variable action
           and print it
         */
        action = some_func( ) + choice;

        printf( "action = %d\n", action );

        return 0;
}


修改后我执行后的结果如下
[root@youzi ~]# gcc -o forum forum.c
[root@youzi ~]# ./forum tom
action = 104
[root@youzi ~]# ./forum jerry
action = 105
[root@youzi ~]# ./forum youzi
action = 103
[root@youzi ~]#
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP