一次读取每个字符-C

一次读取每个字符-C,c,getchar,C,Getchar,对于以下内容 练习12336-从程序的标准输入中一次读取一个字符的普通文本,然后打印,每行从左到右颠倒。阅读,直到遇到数据结尾` 您可能希望通过键入来测试程序` prog5rev | prog5rev 查看是否重新创建了原始输入的精确副本。要将字符读取到数据末尾,请使用循环,如` char ch; while( ch = getchar(), ch >= 0 ) /* ch < 0 indicates end-of-data */ or ch

对于以下内容

练习12336-从程序的标准输入中一次读取一个字符的普通文本,然后打印,每行从左到右颠倒。阅读,直到遇到数据结尾`

您可能希望通过键入来测试程序`

      prog5rev | prog5rev
查看是否重新创建了原始输入的精确副本。要将字符读取到数据末尾,请使用循环,如`

   char ch;
   while( ch = getchar(), ch >= 0 ) /* ch < 0 indicates end-of-data */
    or
    char ch;
    while( scanf( "%c", &ch ) == 1 ) /* one character read */
输出:

cba | cba

问题:

问题是:
打印时,每行从左到右颠倒。


此解决方案正确吗?

是的,它按预期工作

您读入一个字符并调用
f
。如果未读取EOF,请再次调用
f
,然后打印读取的字符。因为您在递归调用之后打印字符,所以字符的打印顺序相反

但是,您应该做的一个更改是对数据类型使用
int
而不是
char
getchar
函数返回一个
int
,以便可以正确检测EOF。
putchar
函数接受一个
int
,因此无需担心


另外,由于调用函数没有改变它,因此不需要传递读入的变量的地址。您可以简单地传递变量的值并相应地更改函数。

问题的陈述已经给出了解决方案的提示:

   char ch;
   while( ch = getchar(), ch >= 0 ) /* ch < 0 indicates end-of-data */
    or
    char ch;
    while( scanf( "%c", &ch ) == 1 ) /* one character read */
更新:本书建议使用

 prog5rev | prog5rev
我建议创建一个输入文件,然后运行:

 $ prog5rev < input.txt | prog5rev
$prog5rev
前面的语句假设您正在使用linux(或某些unix)

例如:

[ichramm@wilderjager][~]$ cat input.txt 
hello
world
[ichramm@wilderjager][~]$ ./test < input.txt  
olleh
dlrow
[ichramm@wilderjager][~]$ ./test < input.txt | ./test 
hello
world
[ichramm@wilderjager][~]$cat input.txt
你好
世界
[ichramm@wilderjager][~]$./test
这是一个非常聪明的解决方案,我真的很不愿意破坏它,但是使用堆栈来实现它有一些限制。确切地说是内存限制。如果您有超过一定数量的、相对较少的输入,它将以某种方式达到极限并崩溃,例如:分段错误。古腾堡莎士比亚全集中的5560737个字符都没有通过,它的字符数为654337


您需要使用堆进行更大的输入,对不起。

在规定中,我认为
prog5rev
是程序名,而不是示例输入。他们建议运行两次程序(一个程序的结果通过管道传输到另一个程序),并提供一些其他输入,并期望输出与输入相同,因为它被反转了两次。你似乎误解了这是在程序输入中键入
|
的意思。请不要完成他的全部家庭作业。。。引导并回答有针对性的问题是肯定的,但将整个enchilada分发给他人并不能帮助他学会思考,这才是问题的关键practice@ScottStensland你是认真的吗?规则很明确:答案必须完整。那么,如果答案不完整,你就投反对票,如果答案太完整,你也投反对票?下定决心!我无条件地倾向于递归。总是试图找到奇怪的方法来给出递归的解决方案。这是中国的一个大问题me@overexchange只要你意识到它的局限性,这种方法绝对没有问题。
 prog5rev | prog5rev
 $ prog5rev < input.txt | prog5rev
[ichramm@wilderjager][~]$ cat input.txt 
hello
world
[ichramm@wilderjager][~]$ ./test < input.txt  
olleh
dlrow
[ichramm@wilderjager][~]$ ./test < input.txt | ./test 
hello
world