【问题标题】:Why printf() is not used when scanf returns negative number?为什么scanf返回负数时不使用printf()?
【发布时间】:2015-11-28 15:43:22
【问题描述】:

我编写了一个代码来检查 scanf() 何时返回负数,例如,如果我按 "Ctrl+Z" 它应该退出 while 循环和 printf("Finish!") ,但它是不打印“完成!”有人可以看看吗?

#include <stdio.h>
#include <conio.h>
#include <math.h>

#define G 9.81

float Height(float speed, float angle, float time);
float Horizontal(float speed, float angle, float time);


void main()
{
    float speed;
    float angle;
    float time = 0.1;
    float height = 0;
    float horizontal = 0;
    int res = 0;

    printf("Enter v <0.0 - 100.0 m/s> and a <0-90 degrees>: ");
    res = scanf_s("%f %f", &speed, &angle);
    while (res != -1)
    {
        for (time = 0.1; height >= 0; time += 0.1)
        {
            printf("Time: %.1f .... H = %.2f  S = %.2f \n", time, horizontal = Horizontal(speed, angle, time), height = Height(speed, angle, time));
        }
        height = 0;
        printf("Fallen!\n");
        printf("Enter v <0.0 - 100.0 m/s> and a <0-90 degrees>: ");
        res = scanf_s("%f %f", &speed, &angle);
    }
    printf("\nFinish!\n");
    getch();
}

float Height(float speed, float angle, float time)
{
    float height;
    angle = ((3.14 / 180) * angle);
    height = (speed * sin(angle) * time) - ((G*time*time) / 2);

    return height;
}

float Horizontal(float speed, float angle, float time)
{
    float horizontal;
    angle = ((3.14 / 180) * angle);
    horizontal = (speed * cos(angle)) * time;

    return horizontal;
}

我在 Windows 上使用 Visual Studio(C 语言)。

【问题讨论】:

  • 为什么 scanf() 会返回 -1。 (不是反问,我很感兴趣)?
  • scanf函数的返回值是成功转换的次数,即。 arguments ,输入转换。失败时返回 -1
  • @IlanAizelmanWS 是的,但是为什么按 Ctrl + Z 会失败?
  • 您在问题中提到了scanf,但您的代码使用了scanf_s,这不是标准函数(我认为这是微软的东西?)。我认为您还假设EOF 是-1,这通常不能保证是正确的(尽管它可能是在MS 的情况下,我不知道并且没有方便检查的编译器! )。 scanf 函数返回 分配的字段数 - 不是写入的字符 - 或 EOF 出错,或者如果在读取 first 字符时它得到 end-of-文件。我认为要强制文件结束条件,您必须按 Enter-Ctrl+Z-Enter,这可能是问题所在?
  • @Transcendental 因为 scanf 应该得到 2 个浮点数。如果它得到 (Ctrl+Z) 它不是一个浮点数。这意味着它将返回 -1

标签: c windows printf scanf


【解决方案1】:

这里是 scanf() 的参考:http://www.cplusplus.com/reference/cstdio/scanf/

当 scanf() 遇到文件结尾(这是控制台上 ctrl+z 的通常含义)时,它不是匹配错误:它只是可以读取预期项目的一部分。

让你的 while 使用 >0 而不是 >=0。

【讨论】:

  • 没有帮助。顺便说一句,我使用的是 Visual Studio(c 语言),现在我已经在帖子中添加了完整的代码。顺便说一句,在我按 3 次 Ctrl+z 后,它会打印 Finish。
【解决方案2】:

我相信它应该有效。即使 >= 在一段时间内。绝对适用于带有普通scanf()的unix。

您使用的是什么 IDE 和编译器?你是直接通过 cmd.exe 运行的吗?我建议检查Having troubles with EOF on Windows 7 也如其他答案中所述添加:

printf("\nFinish!\n");

【讨论】:

  • 没有帮助。顺便说一句,我使用的是 Visual Studio(c 语言),现在我已经在帖子中添加了完整的代码。顺便说一句,在我按 3 次 Ctrl+z 后,它会打印 Finish。
  • 您还更改了 while 的条件,我认为其中的 >= 实际上很好,并且至少适用于标准 scanf。现在看起来像前两次按下 Ctrl-Z 它以 &speed 和 &angle 结束,第三次它实际上终止了循环。
  • 我将 scanf_s 更改为 scanf ,也无济于事。
【解决方案3】:

请务必在 Ctrl+Z 后按 Enter。默认情况下,终端输入是行缓冲的,当遇到换行符时将其传递给程序。

另外,您很可能正在一个单独的终端窗口中运行程序,该窗口在程序退出时关闭。这将解释最后需要getch();,以便能够看到输出,然后通过按键关闭窗口。

默认情况下,printf 被缓冲,当到达换行符\n 时,输出被写入终端。当程序退出(exit 调用或main 返回)时,缓冲区也会被刷新。在你的情况下,它会在你按下一个键后打印出来,你可能看不到它,因为窗口关闭了。

要解决这个问题,请在末尾添加一个换行符:

printf("\nFinish!\n");

【讨论】:

  • 没有帮助。顺便说一句,我使用的是 Visual Studio(c 语言),现在我已经在帖子中添加了完整的代码。顺便说一句,在我按 3 次 Ctrl+z 后,它会打印 Finish。
猜你喜欢
  • 2017-03-04
  • 2012-06-03
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多