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”。它还会看到终端为回车键放入流中的换行符,并拒绝它并将其推回流中。
我对 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”。它还会看到终端为回车键放入流中的换行符,并拒绝它并将其推回流中。