为什么C程序在运行scanf时只显示一行输入提示?

#include <stdio.h>
int main(void)
{
    int height,length,width,volume,weight;
    printf("Enter height of box:");
    scanf("%d",&height);
    printf("Enter length of box:");
    scanf("%d",&length);
    printf("Enter width of box:");
    scanf("%d",&width);
    volume=height*length*width;
    weight=(volume+165)/166;

    printf("volume(cubic inches):%d\n",volume);
    printf("Dimensional weight (pounds);%d\n",weight);

    return 0;
}

运行时只会显示 Enter height of box 这一行

用的是 Microsoft Visual C++ 2010 学习版

尝试加入宏定义,系统提示我查看scanf的声明

阅读 2.4k
2 个回答

在你的C程序中,scanf函数用于从标准输入(通常是键盘)读取数据。如果你在运行程序时只看到了第一行输入提示(Enter height of box:),然后程序似乎没有继续显示后续的提示,这通常是由于输入缓冲区的问题或者程序没有按预期执行。

首先,确认你的程序是否在等待输入。在scanf调用之后,程序会等待用户输入一个整数并按下回车键。如果用户没有输入整数或者输入了非整数数据,scanf可能会因为匹配失败而停止读取,并且不会清空输入缓冲区中的错误输入。这可能导致程序看起来“卡住”了,实际上它只是在等待有效的输入。

为了解决这个问题,你可以尝试以下几个步骤:

  1. 确保输入正确:在运行程序时,确保你按照提示输入了正确的整数值,并且每次输入后都按下了回车键。
  2. 检查输入缓冲区:如果输入了错误的数据(比如字母而不是数字),scanf会停止读取,并且不会清除输入缓冲区中的错误数据。你可以通过在scanf之后添加一个循环来清除缓冲区中的剩余字符,直到遇到换行符为止。例如:

    int c;
    while ((c = getchar()) != '\n' && c != EOF) { /* 忽略并清除缓冲区 */ }

    在每次scanf调用之后添加这样的循环可以帮助确保输入缓冲区被清空,从而避免由于之前的错误输入导致的阻塞。

  3. 使用更健壮的输入函数:考虑使用fgetssscanf等函数来代替scanf,因为它们提供了更好的错误处理和字符串处理能力。
  4. 检查编译器和IDE设置:有时候,IDE(如Microsoft Visual C++ 2010)的设置可能会影响程序的执行。确保你的IDE配置正确,没有启用任何可能会干扰标准输入输出的特殊功能或模式。
  5. 调试程序:使用IDE的调试功能来逐步执行程序,并观察程序的行为和变量的值。这可以帮助你找出问题所在。

关于你提到的宏定义和scanf的声明,通常不需要为scanf添加宏定义。如果系统提示你查看scanf的声明,可能是因为编译器在某种情况下无法识别scanf函数。这通常是由于缺少包含stdio.h头文件或者项目配置问题导致的。在你的代码中,你已经正确地包含了stdio.h,所以问题可能出在其他地方。

最后,请确保你的代码没有其他的语法错误或逻辑错误,这些错误可能会影响程序的执行流程。如果问题仍然存在,尝试在一个简单的环境中(比如只包含scanfprintf的简短程序)重现问题,以便更容易地定位问题所在。

在每次 scanf 调用后清除输入缓冲区,并且检查输入是否有效。如果输入无效,程序会提示错误并退出。

我将代码改进了一下

#include <stdio.h>

// 清除输入缓冲区的函数
void clear_input_buffer(void) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

// 获取用户输入的函数
int get_input(const char *prompt) {
    int value;
    printf("%s", prompt);
    while (scanf("%d", &value) != 1) {
        printf("Invalid input. Please enter an integer.\n");
        clear_input_buffer(); // 清除错误输入
        printf("%s", prompt);
    }
    clear_input_buffer(); // 清除输入缓冲区
    return value;
}

int main(void) {
    int height, length, width, volume, weight;

    height = get_input("Enter height of box: ");
    length = get_input("Enter length of box: ");
    width = get_input("Enter width of box: ");

    volume = height * length * width;
    weight = (volume + 165) / 166;

    printf("Volume (cubic inches): %d\n", volume);
    printf("Dimensional weight (pounds): %d\n", weight);

    return 0;
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏