V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
spencerqiu
V2EX  ›  C

C 语言如何读入多组的两个数,在读到 0 0 的时候停止?

  •  
  •   spencerqiu · 2015-08-31 23:08:10 +08:00 · 1359 次点击
    这是一个创建于 3403 天前的主题,其中的信息可能已经有所发展或是发生改变。

    另外顺带问一句 while (scanf ("%d%d",&m,&n )==2 && m && n ) 中的 && m && n 的用处是?

    9 条回复    2016-04-15 20:45:31 +08:00
    tomb003
        1
    tomb003  
       2015-08-31 23:17:05 +08:00
    检验输入的 m 和 n 的值不为 0 才进入循环
    kangkang
        2
    kangkang  
       2015-08-31 23:33:13 +08:00
    while (scanf ("%d%d",&m,&n )&&(m||n ));?
    algas
        3
    algas  
       2015-09-01 00:39:39 +08:00
    scanf ()的返回值解释: These functions return the number of input items successfully matched and assigned 。
    所以 while 中的的第一个判断是保证确实读入了两个数,==2 返回 1 ;
    &&m 和&&n 使得 m 和 n 中存在一个 0 的时候, while ()中的条件整体为 0 。应该起不到标题里的作用。
    harttle
        4
    harttle  
       2015-09-01 01:13:09 +08:00
    我猜我理解你的意思了, while (scanf ("%d %d",&m,&n )==2 && m && n ) 就可以读到两个零时停止。但需要注意:

    * 你的输入必须是无歧义的:比如对于输入“ 2200 ”会被作为一个 int 读入到 m 中,所以需要空格分隔,比如: 2 2 0 0 。所以 scanf 的参数里面的两个%d 之间也要有空格;
    * &&m && n 的含义: while (<expr>)括号中的<expr>表达式的值是 while 的循环条件,值为 0 ( false )时停止循环。而&&是与操作符,就是说: scanf (...) == 2 (读入了两个数)并且 m 不为零并且 n 不为零时,循环才继续。

    关于 scanf 的返回值:
    On success, the function returns the number of items of the argument list successfully filled.
    当成功时,函数返回参数列表中成功填充的项的数目。

    参见 http://www.cplusplus.com/reference/cstdio/scanf/
    spencerqiu
        5
    spencerqiu  
    OP
       2015-09-01 06:25:49 +08:00 via iPad
    @tomb003
    @kangkang
    @algas
    @harttle
    如果我只使用 while (scanf ("%d%d",&m,&n )==2 ) 在循环内加 if (m==0 || n==0 ) break; 能有同样效果?
    ljbha007
        6
    ljbha007  
       2015-09-01 07:39:21 +08:00
    @spencerqiu
    是一样的 而且读起来还轻松很多
    algas
        7
    algas  
       2015-09-01 10:38:19 +08:00
    @spencerqiu
    这个是说有一个 0 就会停止循环,而不是 m 和 n 同时为 0 时跳出循环。
    同时为 0 ,应该使用 if (m==0 && n==0 ) break;

    另外, while (scanf ("%d %d",&m,&n )==2 )会在你输入 1 a ,这样的情况下终止循环,
    所以,如果需要读入 0 0 停止循环,可以简单的写成:
    while (1 ) {
    scanf ("%d %d", &n, &m );
    if (n==0 && m==0 )
    break;
    }
    sparkrat
        8
    sparkrat  
       2015-09-01 13:50:37 +08:00
    while (~scanf ("%d%d", &m, &n ) && m+n ){
    // balabala
    }
    rushcheyo
        9
    rushcheyo  
       2016-04-15 20:45:31 +08:00
    @sparkrat -1 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3479 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:34 · PVG 12:34 · LAX 20:34 · JFK 23:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.