为什么scanf会导致我的代码无限期地运行?

时间:2019-06-19 22:46:11

标签: c scanf

当我尝试运行此代码时,它将无限期运行。我尝试使用scanf_s,但没有任何改变。

#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*width*length;
    weight=(volume+165)/166;

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

    return 0;
}

3 个答案:

答案 0 :(得分:1)

代码中的第一个打印件(和其他类似打印件):

printf("enter height of box: ")

默认情况下,此行会将文本放入缓冲区。仅当发生以下任一情况时,缓冲区才会写入终端(“刷新”):

  1. 缓冲区已满(可以为1024字节,16384或任何其他数字)。
  2. 文本末尾有一个换行符(假定输出到终端)。

    请注意,这是常见的行为,但标准并不能保证。阅读Is stdout line buffered, unbuffered or indeterminate by default?来涵盖这个主题。

  3. 当您从stdin读取内容时,某些C实现会自动刷新stdout,但许多实现却不会。

    阅读Does reading from stdin flush stdout?可以涵盖此主题。

因此,如果将行更改为:

 printf("enter height of box: \n");

第二种选择是强制刷新,以便将缓冲区写入输出:

 printf("enter height of box: ");
 fflush(stdout);

第三个选项是完全禁用缓冲。为此,您可以使用setbuf

void setbuf( FILE* stream, char* buffer );
     
      
  • 缓冲区-
      指向要使用的流的缓冲区的指针。 如果提供NULL,则关闭缓冲。如果不为null,则必须至少能够容纳BUFSIZ个字符
  •   

因此,只需在程序的开头添加以下内容,所有标准缓冲将被关闭:

setbuf(stdout, NULL);

答案 1 :(得分:0)

代码中似乎没有任何错误。我尝试在Ubuntu和OnlineGDB上运行它。该代码运行良好。可能是编译器的错误。

您应检查返回的“ scanf”是什么。 您可以使用以下方法进行检查:-(这里d是您的整数)

if (scanf("%d", &d) == 1)
    ...all OK...
else
    ...EOF or conversion failure...

如果您有几次转换,请检查它们是否都已完成。

答案 2 :(得分:0)

可能存在问题,因为您可能没有输入任何值作为输入。

在所有其他情况下,该代码似乎都能正常工作。