- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#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
之间有任何差异。/fgetc
或putchar
/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/
我很抱歉我英语不好。 让我们看看下面的代码。 main = getChar 首先,main会被求值,它的值是“getChar”,但是编译器不知道“getChar”的值,所以编译器会求值“getChar
我正在尝试比较用户插入的两个(或更多)输入。我正在为它使用 getchar() 函数,但它似乎不起作用......我需要先检查它的字母(英文),以及是否连续没有 2 个(或更多)大写或小写字母。这是我
当我想弄清楚 getchar() 到底做了什么时,这一小段 loop 确实让我感到困惑。 int i; int c; for (i = 0; i 验证您的输入。 因此,您应该在完成 getchar 后
#include int main(){ char ch; while((ch=getchar())!=EOF){ putchar(ch); } cha
我在关注《C Primer Plus》这本书,遇到这样一段代码: // echo_eof.c -- repeats input to end of file. #include int main(v
我只是编程的初学者。我正在学习 K&R 的书《C 编程语言》。我一边看一边对这个问题越来越好奇——当有一个循环从输入中一个一个地获取字符时,我在循环中放置了一个输出函数,我认为其结果就像在输入每个字符
人们通常会提到 while( getchar() != '\n' ) 当谈到清除输入缓冲区或溢出时。 fgetc 或 getc 也可以。例如: while( fgetc(stdin) != '\n'
一旦遇到'~',之后的任何内容都不会被打印出来,控制就出来了while循环 while((c = getchar()) != '~') { putchar(c); printf(" "
我有一个执行大量处理的小程序。您可以通过按回车键打印进度。 我实现它的方法是在主线程中完成处理,同时我有一个 pthread 不断循环 getchar() 以等待输入键。 问题是当我完成处理时。发生这
我试图解决 K&R 中的问题 1.6。问题是—— 验证表达式getchar() != EOF 为 0 或 1。 我找到了一个可行的解决方案: #include int main(){ int
我正在尝试开发一个(简单的)个人项目,它使用经典的“MOD 10”规则充当信用卡验证器。 我在项目的第一部分遇到了一些困难。 目标是这样的: 从用户那里获取 16 个字符,一次一个。 每输入一个字符,
对于我的一个练习,我们需要逐行阅读并仅使用 getchar 和 printf 输出。我正在关注 K&R,其中一个示例显示了使用 getchar 和 putchar。根据我的阅读,getchar() 一
我只是想知道如何 getchar() 实现了吗?是不是像下面这样?以这种方式读取单字节效率非常低。它是否使用一些缓冲? 伪代码: int getchar() { char buf[1];
在 K&R 书中的以下代码示例中,如果我将 putchar(c) 替换为 printf("%c", c),代码的工作方式相同。但是,如果我用 printf("%d", c) 替换它,它会给出乱码输出。
我想选择性地中止 getChar行动。我需要以下功能: getChar' :: (Char -> IO ()) -> IO (IO ()) 如果是abort IO ()) -> IO (IO ())
所以我知道 getchar() 在输入结束或发生错误时返回 EOF。我也知道我可以通过 ferror(stdin) 和 feof(stdin) 来检查哪些情况发生了。我想知道特别是在什么情况下会发生错
我无法忽略空格/制表符。当用户从命令提示符输入字符时,它应该只接受除空格或制表符空格之外的任何字符。 例如: $ ./a.out Character: = 那么,就是= 如果 $ ./a.out Ch
我正在使用 chrome devtools network API和下面的代码,但总是在我打开 devtool 窗口 (F12) 时启动警报窗口。有什么方法可以在不打开该窗口的情况下启动警报,例如,当
所以我知道 getchar() 在输入结束或发生错误时返回 EOF。我也知道我可以通过 ferror(stdin) 和 feof(stdin) 来检查哪些情况发生了。我想知道特别是在什么情况下会发生错
所以我一直在自学 C,并且遇到了来自“stdio.h”的“getchar()”和“putchar()”方法。据我了解,“getchar()”从文本流中获取最新的字符并将其存储到一个变量中,而“putc
我是一名优秀的程序员,十分优秀!