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

2015-08-31 23:08:10 +08:00
 spencerqiu

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

1325 次点击
所在节点    C
9 条回复
tomb003
2015-08-31 23:17:05 +08:00
检验输入的 m 和 n 的值不为 0 才进入循环
kangkang
2015-08-31 23:33:13 +08:00
while (scanf ("%d%d",&m,&n )&&(m||n ));?
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
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
2015-09-01 06:25:49 +08:00
@tomb003
@kangkang
@algas
@harttle
如果我只使用 while (scanf ("%d%d",&m,&n )==2 ) 在循环内加 if (m==0 || n==0 ) break; 能有同样效果?
ljbha007
2015-09-01 07:39:21 +08:00
@spencerqiu
是一样的 而且读起来还轻松很多
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
2015-09-01 13:50:37 +08:00
while (~scanf ("%d%d", &m, &n ) && m+n ){
// balabala
}
rushcheyo
2016-04-15 20:45:31 +08:00
@sparkrat -1 1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/217441

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX