scanf 和 getchar 如何协同工作?

How does scanf and getchar work together?

我对 scanf 如何与 getchar 一起工作感到困惑。我假设 scanf 可以获取用户输入,然后当用户按下 enter 时它分别分配输入。而 getchar 通过获取每个字符并将其分配给 getchar 分配给的变量来​​工作。查看这段代码:

#include <stdio.h>

int main (){
    int num, i;
    char ch;
    printf("Enter an expression: ");
    scanf("%d", &i);
    while ((ch = getchar()) != '\n'){
        if (ch == '+'){
            scanf("%d", &num);
            i += num;
            break;
        }
    }
    printf("%d", i);
}

我不应该输入3次吗?第一个 scanf,然后是 getchar,然后是最后一个 scanf,还是我在这里遗漏了一些关键信息?我是 C 的新手,我希望你不要介意我的这个(可能是愚蠢的)问题 :)

scanf 不参与用户按下回车时的数据传输。

C 程序有数据流。 (尽管它们是用 FILE * 类型处理的,但它们是流,而不是文件。) scanf 从标准输入流中读取。通常,标准输入流连接到终端设备(过去是物理终端设备,现在更可能是软件终端 window)。终端设备具有关于何时将用户键入的数据发送到流的协议。同样最常见的是,当用户按下回车键时,他们输入的数据将发送到流中。此外,在 Unix 系统上,按 control-D 将键入的数据发送到流。

为了完成它的工作,scanf 向流请求一个字符。然后它分析字符如何匹配它正在处理的转换。例如,当 scanf 正在处理 %d 转换时,它预计开头可能有一些白色-space 字符(它会跳过),然后可能是“+”或“-”,然后是一些数字。任何其他字符都会停止转换。因此,当 scanf 开始进行 %d 转换时,它会获得一个字符。如果没有字符可用,可能是因为用户已经输入了一些内容但还没有按下回车键,那么 scanf 就坐在那里等待字符的到来。当用户按下回车键时,scanf 获取第一个字符。

请注意 scanf 未参与等待按下回车。这是终端的功能。此时scanf只有第一个字符,不知道是否按下了enter。

scanf读取数字后,读取下一个字符。当该字符与 %d 模式不匹配时,它将字符放回流中。因此,如果用户键入“123+456”,scanf 处理“123”,获取“+”,拒绝“+”,并将“+”推回流中。

然后 getchar 得到“+”和 returns 它。

然后后面的scanf读到“456”。它还会看到终端为回车键放入流中的换行符,并拒绝它并将其推回流中。