【问题标题】:How to check for end of input? C, find 42如何检查输入是否结束? C、找到42
【发布时间】:2014-01-11 14:38:07
【问题描述】:

这就是问题所在:
您的程序是使用蛮力方法来找到生命、宇宙和一切的答案。更准确地说……将小数从输入改写到输出。读入数字 42 后停止处理输入。输入处的所有数字都是一位或两位数的整数。

输入:
1
2
88
42
99

我的第一个代码不起作用:

while( scanf("%d\n", &n) != 42 ){
    printf("%d\n",n);
}

第二个代码,带有 for 循环,可以工作,但是有一个测试用例没有数字 42,所以它返回 TLE,我如何检查输入结束?

for(i=1;i>0;i++){
    scanf("%d\n",&n);
    if(n!=42 ){       /* end of input??? */
        printf("%d\n",n);
    }
    else {
        break;
    }
}

为什么while循环不能正常工作?

【问题讨论】:

  • 详细了解scanf 及其返回的内容。

标签: c loops input


【解决方案1】:

scanf 返回扫描的字符数,而不是结果。

所以,写while循环如下:

scanf("%d", &n);
while( n != 42 ){
    printf("%d\n",n);
    scanf("%d", &n);
}

【讨论】:

    【解决方案2】:

    避免幻数总是好的。定义一个常量。

    检查scanf() (@Joachim Pileborg) 的结果

    要检查输入是否有效,请测试 scanf() 结果是否为 1(正确扫描了 1 个格式说明符)。

    要检查输入是否结束,请测试scanf() 结果是否为 EOF。

    @dbasic 很好地解释了while 循环失败。粗略地说,scanf() 报告扫描的字段数,而不是扫描的

    scanf() 有很多内容。如果可以,请阅读 C 规范的 scanf() 部分。 Where do I find the current C or C++ standard documents?

    const int Answer_to_Life_the_Universe_and_Everything = 42;
    int n;
    int cnt;
    // Use 2d to limit to 2 digits
    while ((cnt = scanf("%2d\n",&n)) == 1) {  
      if(n != Answer_to_Life_the_Universe_and_Everything) {   /* end of input? */
        printf("%d\n",n);
      }
      else {
        break;
      }
    }
    if (cnt != EOF) Handle_UnexpectedInput();  // example someone type in "junk"
    

    【讨论】:

    • 您有一些语法错误,但 while ((cnt = scanf(%2d\n",&n)) == 1) 是我需要的
    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多