【问题标题】:Why does EOF not terminate during my scanf while loop?为什么 EOF 在我的 scanf while 循环期间没有终止?
【发布时间】:2018-08-21 19:31:18
【问题描述】:

我刚开始学习 C++,正在尝试学习如何使用 scanf 和 printf 来加快输入和输出。这是我目前正在处理的代码:

#include <stdio.h>
using namespace std;

int main() {
    int time, record;
    double down, loan;
    while (scanf("%d %lf %lf %d", &time, &down, &loan, &record) != EOF) {
        double value = down + loan;
        double owed = loan;
        double payment = owed/time;

        // current simulated month and depreciation
        int rday, c = 0;
        double temp, dep;
        bool found = false;

        // finds value and owed after records
        while (!found && record > 0) {
            scanf("%d %lf", &rday, &temp);
            // adjusts value and owed to day before listed on record
            while (!found && c <= rday) {
                if (c == rday) {
                    dep = temp;
                }
                value *= 1 - dep;
                if (c > 0) {
                    owed -= payment;
                }
                c++;

                // determines if found date
                if  (owed < value) {
                    found = true;
                }
            }
            record--;
        }

        // finds point where owed < value
        while (!found && value < owed) {
            value *= 1 - dep;
            owed -= payment;
            c++;
        }

        if (c - 1 == 1) {
            printf("%d month\n", c - 1);
        }
        else {
            printf("%d months\n", c - 1);
        }
    }
    return 0;
}

当我在 Code::Blocks 上运行它时,它会打印正确的答案,但即使我输入 CTRL+Z(我使用的是 Windows),最外面的 while 循环也不会终止。这是我的输入:

30 500.0 15000.0 3
0 .10
1 .03
3 .002
12 500.0 9999.99 2
0 .05
2 .1
60 2400.0 30000.0 3
0 .2
1 .05
12 .025
-99 0 17000 1

这是发生了什么的图片:

Error

我尝试将循环条件更改为scanf("%d %lf %lf %d", &amp;time, &amp;down, &amp;loan, &amp;record) == 4,但同样的问题发生了。有人可以解释一下我的代码有什么问题吗?

【问题讨论】:

  • ".. 学习 C++ 并且正在尝试学习如何使用 scanf 和 printf 更快" --> 考虑学习流 &lt;&lt;&gt;&gt;。为 C 保存 scanfprintf
  • 为什么代码不检查scanf("%d %lf", &amp;rday, &amp;temp);的返回值?我怀疑这是“最外面的while循环没有终止”的来源,因为内部从未完成。要么是那个,要么你没有正确地发出 end-of-file 信号。
  • 在“ctrl+z”之后按“enter”可以吗? Ctrl+z 只是将EOF 添加到标准输入,但scanf 仅在按下enter 时处理。
  • 如何确定代码没有卡在while (!found &amp;&amp; value &lt; owed)
  • nitpick: 代替 '#include ' 使用 '#include ' 见stackoverflow.com/questions/10460250/cstdio-stdio-h-namespace

标签: c++


【解决方案1】:

排队

while (scanf("%d %lf %lf %d", &time, &down, &loan, &record) != EOF)

您希望在读取成功时读取 4 个变量。当scanf 能够成功地从stdin 中提取所有参数的数据时,它将返回4。更改检查以使用该数字。

while (scanf("%d %lf %lf %d", &time, &down, &loan, &record) == 4)

【讨论】:

  • 我已经尝试使用该循环条件。不幸的是,同样的问题发生了。
  • @nullptr,这确实很奇怪。
  • @nullptr,见forums.codeblocks.org/index.php?topic=19351.0。它说 SOLVED: 按 ctrl+Z 后,您必须按 Enter。我使用的是 Windows 7
  • 我每次都在CTRL+Z之后按回车。
  • @nullptr,还是没有运气?
【解决方案2】:

这是因为scanf永远不会返回EOF,所以永远不会满足终止条件。

【讨论】:

  • @CiaPan:感谢您的回复。当你说scanf 永远不会返回 EOF 时,你能澄清一下你的意思吗?我检查了 www.cplusplus.com 上的文档,它说“如果发生读取错误或在读取时到达文件结尾,则设置正确的指示符(feof 或 ferror)。并且,如果任何一个发生在任何数据之前可以成功读取,返回EOF。”
  • 来自en.cppreference.com/w/c/io/fscanf如果在分配第一个接收参数之前发生输入失败,则为 EOF。
  • @RSAHU 所以我知道你已经知道原因:存在一些运行时约束违规,对吧?
  • @CiaPan,第一条评论不正确。它们适用于scanf_s 函数族。新注释适用于scanf 函数族。
【解决方案3】:

感谢大家的建议和回答!我发现了这个错误。有点尴尬,但事实证明问题出在最后一行输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多