gpt4 book ai didi

c - 关于 Stream 以及 getchar() 和 fgetc()

转载 作者:行者123 更新时间:2023-11-30 20:31:27 24 4
gpt4 key购买 nike

#include<stdio.h>

int main(void)
{
int ch1, ch2;

ch1 = fgetc(stdin);
ch2 = getchar();

fputc(ch1, stdout);
putchar(ch2);

return 0;
}

今天我先了解一下stream。我明白了什么是流。但我无法理解这个程序的打印结果。我按“p”并输入键。这个程序打印了

p

按任意键继续...

在我读的书中,它说“输入键是一种ascii代码,所以你可以看到这个结果。”但是在首页,它说getchar和fgetc是接收字符的函数。但为什么它不像这样打印

a b
A

当我按“a”、空格键和“b”时?

我可以了解流和这两个函数( getchar() 和 fgetc() )吗?

最佳答案

根据定义,这三个调用是相同的:

getchar()
getc(stdin)
fgetc(stdin)

所以你发布的程序完全等同于

ch1 = getchar();
ch2 = getchar();

putchar(ch1);
putchar(ch2);

如果您对该程序的工作原理感到困惑,这并不是因为 getchar 之间有任何差异。/fgetcputchar/putc .

如果您运行此程序,然后按 p 和 Enter 键,我预计 ch1最终包含 'p' ,和ch2最终包含换行符。如果你运行这个程序并输入“ab”并按回车键,我预计 ch1最终包含 'a' ,和ch2最终包含空格字符。我不希望这个程序能够打印“a b”,因为它只能读取和打印两个字符。

一开始考虑逐个字符的阅读总是很棘手。这是因为,在幕后,系统通常会在您键入时读取整文本,然后仅在您按 Enter 键后才将这些字符提供给您的程序。

如果您打印出更多信息,就更容易了解发生了什么。例如,以下是对您的程序的修改:

#include <stdio.h>

int main()
{
int ch1, ch2;

ch1 = fgetc(stdin);
ch2 = getchar();

fprintf(stdout, "ch1 = '%c'\n", ch1);
printf("ch2 = '%c'\n", ch2);
}

当我运行这个程序并点击 p 和 Enter 键时,我看到了

ch1 = 'p'
ch2 = '
'

如您所见,ch2最终包含换行符。

当我运行这个程序并点击 a 和空格以及 b 和 Enter 键时,我看到了

ch1 = 'a'
ch2 = ' '

嗯,更准确地说,我看到的是

a b
ch1 = 'a'
ch2 = ' '

但是第一行 a b正是我的计算机在我键入字符时回显这些字符的地方。 (另请参见 this web page ,尤其是以“最后,不要失望”开头的段落。)

同样,fgetc(stdin) 之间没有重要区别。和getchar这里。我本来可以写

ch1 = getchar();
ch2 = getchar();

printf("ch1 = '%c'\n", ch1);
printf("ch2 = '%c'\n", ch2);

它也会做同样的事情。

最后,如果您编写一个读取和打印整字符的程序,它可能会帮助您更清楚地看到事情。您的第一个程序恰好读取了两个字符。这是一个程序,它不断读取和打印,直到看到 '\n'标记行结束的字符:

#include <stdio.h>

int main()
{
int c;

c = getchar();
while(c != '\n') {
printf("c = '%c'\n", c);
c = getchar();
}
}

该程序读取一个字符。如果不是换行符\n ,它打印它并读取另一个字符。如果这不是换行符,它将打印它并读取另一个字符。它继续读取和打印,直到看到换行符,然后停止。如果我运行它并输入“a b c”,我会看到

c = 'a'
c = ' '
c = 'b'
c = ' '
c = 'c'

(我没有看到为换行符打印的行,因为该程序在读取换行符之后和打印它之前立即停止读取。)

再说一遍,我在屏幕上实际看到的是

a b c
c = 'a'
c = ' '
c = 'b'
c = ' '
c = 'c'

但是第一行a b c只是我在程序有机会读取和打印任何字符之前输入字符。

即使对于像这样的简单测试,我也永远不会那样编写程序。我会将循环写为

while(c != '\n' && c != EOF) {
...

因为我还想确保程序在看到文件结束条件时停止读取,即 if getchar返回特殊代码EOF .

关于c - 关于 Stream 以及 getchar() 和 fgetc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com