输入说明:
您的程序将在一个或多个测试用例上进行测试。每个测试用例由一个正数组成(0 < n0 < 1, 000, 000)。
输入文件的最后一行有一个零(这不是测试用例的一部分。)
我刚刚输入了这样的代码:
int main()
{
int n0;
while((scanf("%d", &n0)) != 0)
{
..........
}
但是为什么当输入 0 仍然被处理时?
while (1) {
scanf("%d", &n0);
if (n0==0) break;
...
}
0 仍然被处理,因为 scanf 的返回值是它填充的项目数。如果您的输入文件以 0 结尾,它将返回 1 - 而不是零。
您想检测您的值何时为零,然后跳出循环。
这是使用 C 中很少被记住的运算符之一“,”或排序运算符的理想场所。这是您重写的代码以使用它:
#include <stdio.h>
int main()
{
char *str[] = { "123", "456", "789", "0" };
int i = 0;
int n0;
int scanret;
while((scanret = sscanf(str[i], "%d", &n0)), n0 != 0)
{
printf("i = %d n0 = %d scanret = %d\n", i, n0, scanret);
i += 1;
}
printf("i = %d n0 = %d scanret = %d after loop termination\n", i, n0, scanret);
}
看一下while
循环的条件。这里发生的是首先评估 sscanf,然后n0 != 0
评估测试。请注意,这不是“与”或“或”运算符(您可以通过检查下面的示例输出来确定) - 执行 sscanf,然后将结果n0 != 0
用作while
循环的测试,因为while
使用的值最后一个表达式在其条件中评估为条件的值。
如果你运行它,你会得到类似于以下的输出:
i = 0 n0 = 123 scanret = 1
i = 1 n0 = 456 scanret = 1
i = 2 n0 = 789 scanret = 1
i = 3 n0 = 0 scanret = 1 after loop termination
分享和享受。