为什么当scanf返回负数时不使用printf()?

时间:2015-11-28 15:43:22

标签: c windows printf scanf

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

#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语言)。

3 个答案:

答案 0 :(得分:1)

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

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

使用&gt; 0代替&gt; = 0。

答案 1 :(得分:0)

确保在Ctrl + Z后按Enter键。默认情况下,终端输入是行缓冲的,并在遇到换行符时传递给程序。

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

默认情况下,缓存printf,并在达到换行符\n时将输出写入终端。程序退出时会刷新缓冲区(exit调用或main返回)。在您的情况下,按下某个键后会打印出来,但由于窗口关闭,您可能无法看到它。

要解决此问题,请在结尾处添加换行符:

printf("\nFinish!\n");

答案 2 :(得分:0)

我相信它应该有效。即使使用&gt; = in。绝对适用于普通scanf()的unix。

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

printf("\nFinish!\n");