使用printf和scanf在C语言中编写代码时不能按预期工作

4

我完全不懂C语言。我在使用带有MinGW编译器的Eclipse。我正在学习scanf和printf函数的使用,目前程序可以正常运行,但是只有在我输入三个整数后才会将语句打印到控制台。

#include <stdio.h>
int main(void){
    int length, height, width, volume, dweight;

    printf("Enter the box length: ");
    scanf("%d", &length);
    printf("\nEnter the box width: ");
    scanf("%d", &width);
    printf("\nEnter the box height");
    scanf("%d", &height);

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

    printf("Dimensions: l = %d, w = %d, h = %d\n", length, width, height);
    printf("Volume: %d\n", volume);
    printf("Dimensional Width: %d\n", dweight);

    return 0;
}

控制台输出:

8 (user input + "Enter" + key)
10 (user input + "Enter" key)
12 (user input + "Enter" key)
Enter the box length: 
Enter the box width: 
Enter the box heightDimensions: l = 8, w = 10, h = 12
Volume: 960
Dimensional Width: 6

有什么见解吗?我期望它会打印,然后使用scanf接收用户输入,像这样:

Enter the box length: (waits for user int input; ex. 8 + "Enter")
Enter the box width: ...

2
尝试在第一个printf之前调用fflush(stdout) - Grijesh Chauhan
1
此外,您应该检查scanf的返回值。 - Ed Heal
你使用哪个编译器?在gcc中它会很好地工作。 - sujin
1
如果在printf语句之后使用fflush,它就会起作用。 - ChrisMcJava
https://dev59.com/U2Qn5IYBdhLWcg3wY2TK - Adam Burry
显示剩余3条评论
2个回答

7
只需在每个 printf() 后添加 fflush(stdout);,然后再调用 scanf():
#include <stdio.h>
int main(void){
    int length, height, width, volume, dweight;

    printf("Enter the box length: "); fflush(stdout);
    scanf("%d", &length);
    printf("\nEnter the box width: "); fflush(stdout);
    scanf("%d", &width);
    printf("\nEnter the box height"); fflush(stdout);
    scanf("%d", &height);

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

    printf("Dimensions: l = %d, w = %d, h = %d\n", length, width, height);
    printf("Volume: %d\n", volume);
    printf("Dimensional Width: %d\n", dweight);

    return 0;
}

那就做到了。为什么呢? - ChrisMcJava
2
在你的系统上,stdout中的文本仍然在内存中缓冲,并且等待直到你打印足够多的内容来填满内部缓冲区,或者你显式地刷新缓冲区的内容。这是出于效率原因。缓冲输出通常比I / O更高效...系统将缓冲区作为单个大块的输出发送,而不是一点点地发送。在您的情况下,这不是您想要的行为。不同的系统在这方面可能会有完全不同的行为;这是实现相关的行为。 - phonetagger
2
顺便提一下,可能会触发刷新的另一个事件是程序退出。所以,如果你已经编程了一段时间,从未遇到过这种情况,那是因为你可能从未使用过scanf()。另一个可能性是输出流中的 '\n' 可能会触发刷新。并不需要换行符来触发刷新,但在某些系统上可能会这样做。 - phonetagger

1

处理C语言中的脏缓冲区!!

您可以在每个printf()的末尾包含一个换行符(转义序列)'\n',这有助于刷新缓冲区,最终使输出终端上的显示生效。(虽然fflush(stdout)可以实现相同的功能,但无需每次调用printf()时都写入它,只需包含一个字符'\n'

注意:始终建议将'\n'字符用作printf()引号""中的最后一个元素,因为数据将保留在缓冲区中,除非使用刷新机制,否则缓冲区不会被清空,但是当main()函数结束时,缓冲区会自动刷新。此外,数据只有在中间缓冲区被刷新时才到达目的地。

我们的新代码应该如下所示:

#include <stdio.h>
int main(void){
    int length, height, width, volume, dweight;
    printf("Enter the box length: \n");
    scanf("%d", &length);
    printf("\nEnter the box width: \n");
    scanf("%d", &width);
    printf("\nEnter the box height \n");
    scanf("%d", &height);
    volume = length * width * height;
    dweight = (volume + 165) / 166;
    printf("Dimensions: l = %d, w = %d, h = %d\n", length, width, height);
    printf("Volume: %d\n", volume);
    printf("Dimensional Width: %d\n", dweight);
    return 0;
}

控制台输出:

Enter the box length: 
8
Enter the box width:  
10
Enter the box height 
12
Dimensions: l = 8, w = 10, h = 12
Volume: 960
Dimensional Width: 6

1
printf() 结尾加上一个换行符,在 scanf() 前似乎对我没有任何影响。 - user6276743

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接