这是打印数字的简单c代码.

#include <stdio.h>

int main() {
    int num;
    
    while (1) {
        scanf("%d", &num);
        if (num == -1) {
            break; // Exit loop when -1 is encountered
        }

        printf("%d \n", num);
    }
    
    return 0;
}

这是它在航站楼里的样子

enter image description here

我有一个问题,为什么程序不在输入时立即打印数字,而是在打印之前等待所有输入.我也很好奇输入空格和按Enter键之间的区别.

推荐答案

获得观察到的行为的原因是,当连接到终端时,标准输入默认情况下是行缓冲的,而终端本身是行缓冲的.

因此,前scanf()个请求来自stdin的输入,这导致来自终端的读请求直到通过按Enter键输入换行符时才返回.

然后,scanf()可以读取和转换第一个数字3,使 4 5 -1\nstdin缓冲器中挂起.

scanf()设置num3并返回1main函数,printf()输出3和换行符,

循环继续,第二个scanf()调用读取数字4,并打印出来...

下一个数字5也是如此...

scanf()的最后一个调用读取-1,这会导致循环以break语句结束,程序退出到shell .

如果您使用Enter键而不是空格栏,则终端将很快返回到scanf(),并且Enter键被击中后将立即显示数字.

C++相关问答推荐

自定义malloc实现上奇怪的操作系统依赖行为

找出文件是否包含给定的文件签名

C/SDL程序,渲染不使用我的渲染器

GCC预处理宏和#杂注GCC展开

如何跨平台处理UTF-16字符串?

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

在C中包装两个数组?

S和查尔有什么不同[1]?

覆盖读取函数,但当文件描述符为3或4时,我有问题

仅从限制指针参数声明推断非混叠

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

有没有办法减少C语言中线程的堆大小?

在吉陀罗中,_2_1_和CONCAT11是什么意思?

按字典顺序打印具有给定字符的所有可能字符串

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

C语言中的指针和多维数组

如何使crc32的结果与cksum匹配?

无法理解 fgets 输出

设置具有非零终止字符串的大整数