当我尝试运行此代码时,它将无限期运行。我尝试使用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;
}
答案 0 :(得分:1)
代码中的第一个打印件(和其他类似打印件):
printf("enter height of box: ")
默认情况下,此行会将文本放入缓冲区。仅当发生以下任一情况时,缓冲区才会写入终端(“刷新”):
文本末尾有一个换行符(假定输出到终端)。
请注意,这是常见的行为,但标准并不能保证。阅读Is stdout line buffered, unbuffered or indeterminate by default?来涵盖这个主题。
当您从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)
可能存在问题,因为您可能没有输入任何值作为输入。
在所有其他情况下,该代码似乎都能正常工作。