Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`getchar()`提供与输入字符串相同的输出_C_Eof_Getchar - Fatal编程技术网

`getchar()`提供与输入字符串相同的输出

`getchar()`提供与输入字符串相同的输出,c,eof,getchar,C,Eof,Getchar,我被K&R中提到的一个使用getchar()的程序弄糊涂了。它提供与输入字符串相同的输出: #include <stdio.h> main(){ int c; c = getchar(); while(c != EOF){ putchar(c); c = getchar(); } } #包括 main(){ INTC; c=getchar(); 而(c!=EOF){ 普查尔(c); c=getchar(); }

我被K&R中提到的一个使用
getchar()
的程序弄糊涂了。它提供与输入字符串相同的输出:

#include <stdio.h>

main(){
    int c;
    c = getchar();
    while(c != EOF){
         putchar(c);
         c = getchar();
    }
}
#包括
main(){
INTC;
c=getchar();
而(c!=EOF){
普查尔(c);
c=getchar();
}
}
为什么要打印整个字符串?我希望它读取一个字符并再次请求输入


而且,我们输入的所有字符串是否都以EOF终止?

在您可能使用的简单设置中,
getchar
使用缓冲输入,因此您必须在getchar读取任何内容之前按enter键。字符串不以
EOF
终止;事实上,
EOF
实际上不是一个字符,而是一个表示文件结束的神奇值。但是
EOF
不是读取的字符串的一部分。这是当没有任何内容可读取时,
getchar
返回的内容。

getchar()
读取输入的单个字符,并将该字符作为函数值返回。如果读取字符时出错,或者输入已结束,
getchar()
返回一个特殊值,表示为
EOF

存在一个底层缓冲区/流,该缓冲区/流由
getchar()
和朋友读取。输入文本时,文本存储在某个缓冲区中
getchar()
可以一次通过一个字符。每次读取都返回下一个字符,直到到达缓冲区的末尾。它不要求您输入后续字符的原因是它可以从缓冲区中获取下一个字符

如果您运行脚本并直接在其中键入,它将继续提示您输入,直到您按CTRL+D(文件结束)。如果您像
/program
那样调用它,其中
myInput
是一个包含一些数据的文本文件,它将在到达输入末尾时获得
EOF
EOF
不是流中存在的字符,而是用于指示何时到达输入末尾的前哨值

作为一个额外的警告,如果遇到错误,我相信
getchar()
也会返回
EOF
,因此您需要检查
ferror()
。下面的示例(未经测试,但您已经了解了想法)


根据
C
定义,字符串以
'\0'
终止。您的程序中没有
“C字符串”

您的程序从标准输入(键盘)读取字符(缓冲到回车),然后将它们写回标准输出(屏幕)。无论您键入多少个字符或输入多长时间,它都会执行此操作

要停止程序,您必须指示标准输入没有更多数据(哼??键盘怎么可能没有更多数据?

只需按Ctrl+D(Unix)或Ctrl+Z(Windows)即可假装文件已到达其结尾。
Ctrl+D(或Ctrl+Z)实际上不是单词意义上的字符

如果使用输入重定向运行程序,
EOF
是文件的实际结尾,而不是文件的结尾

/a.out

根据
getchar()
的定义,它从标准输入中读取一个字符。不幸的是,
stdin
被误认为是键盘,这可能与
getchar
不同
getchar
使用缓冲区作为
stdin
并一次读取一个字符。在您的情况下,由于没有
EOF
,因此
getchar
putchar
会多次运行,在您看来,整个字符串一次打印出来。做一个小小的改变,你就会明白:

putchar(c);
printf("\n");     
c = getchar();
现在将输出与原始代码进行比较

另一个示例将解释
getchar
和缓冲
stdin
的概念:

void main(){
int c;
printf("Enter character");
c = getchar();
putchar();
c = getchar();
putchar();
}
在第一种情况下输入两个字符。第二次运行
getchar
时,是否输入任何字符?没有,但仍然
putchar
工作


这最终意味着有一个缓冲区,当您键入某个内容并单击enter时,它将进入并在缓冲区中定居
getchar
将此缓冲区用作
stdin

不是字符值的EOF而不是int吗?我认为它是一个值为-1的int。字符串以\0结尾。文件以EOF结尾,EOF是-1。我打开了一个文本文件,但在其结尾没有看到EOF。:)不管怎样,如果他们想。。。用一个值来定义EOF并不重要。您应该始终使用常量。@Fahad:文件在其结尾处自然终止,而不是因为文件中的特定位置存在特定值。EOF的值是实现想要的任何值(通常为-1;但始终为EOF),谢谢您提供了CTRL+D信息?似乎奇怪的是,K&R没有提到这个问题,特别是因为他们是基于Unix的。谢谢。当我在K&R中尝试count char程序时,我发现
get char()
像“abc”一样获取我的输入,当计数时,它将是
4
而不是
3
,因此我使用
gdb
对其进行调试,结果是额外的一个“字符”是(nl),其ascii代码是0x0a。那么,我的输入是字符串吗?字符串不是以“\0”结尾吗?为什么会有(nl)?这是因为终止行的换行符是输入的一部分。C是这样的,处理它。
void main(){
int c;
printf("Enter character");
c = getchar();
putchar();
c = getchar();
putchar();
}