【问题标题】:How to read a stream of characters whose length is unknown from standard input in c如何从c中的标准输入中读取长度未知的字符流
【发布时间】:2015-09-17 07:40:49
【问题描述】:

我想从标准输入中读取长度未知的字符流。我正在尝试逐个字符地读取

#include <stdio.h>
int main(void) 
{
    char ch;
    do 
    {
        scanf("%c",&ch);
        //do some comparison of ch
    }while(ch!='');
return 0;
}

帮我在while中写条件,这样我就可以正确读取输入而不进入无限循环

示例输入:

abcdefghijklmnop

【问题讨论】:

  • 你的意思是如何存储你在内存中读取的未知大小的文件?因为阅读是一件容易的事。逐个字符读取效率低下(最好使用getchar)。如果你不想强加大小限制,我相信最好做一个链表,分配一块内存,读取直到它被填满,然后链接一个新的块,直到文件完成。
  • 您认为输入流的结束是什么?回车?还有什么?
  • @Amadan 这与文件无关
  • 流。一样。 (实际上不是一回事,你知道文件的大小,所以我所描述的就不需要了。)除非你的流没有终止;在这种情况下,你应该认真思考当你可以停止倾听时你认为的重点是什么。如果您应该始终继续听,请分叉您的进程或撕掉一个线程。
  • 如果你必须使用scanf,你可以检查它的返回值——因为它有1个匹配的东西,它会在成功时返回1,在EOF或错误时返回feof(stdin) 和ferror(stdin) - 如while ( ( 0 == feof(stdin) ) &amp;&amp; (0 == ferror(stdin) ) )

标签: c input char c-strings


【解决方案1】:

这可能是最简单的解决方案

#include <stdio.h>
int main(void) 
{
    char ch;
    do 
    {
        ch = fgetc(stdin); 
        //do some comparison of ch
    }while( ch != EOF );

return 0;
}

话虽如此,问题陈述如下

从标准输入中读取长度为 未知

有点棘手。根据上面的程序,您可能可以使用 ctrl+d、EOF 停止它或使用文件重定向运行二进制文件

./a.out < input.txt

事实上,标准输入的解释使这个问题更有意义。

【讨论】:

  • 我没有使用文件的权限,甚至不想使用它们。而且我不能使用诸如 ctrl+d 之类的东西。 EOF 是否适用于标准输入?
  • 你将如何结束你的程序?
  • 感谢@kkk,我尝试了 EOF 和 getchar() 的组合。有效。你能帮我用scanf复制同样的功能吗?
  • 检查这个很好的阅读来决定使用scanf stackoverflow.com/questions/3640604/c-getchar-vs-scanf和这个stackoverflow.com/questions/2482634/…的复制案例
  • @BalakrishnaAvulapati 这段代码基本上是正确的,除了 ch 必须 声明为 int。原因是EOF 被定义为–1,而0xff 可能是一个有效字节。
【解决方案2】:

您的转义字符错误。 你想把所有东西都写在一行上吗?然后使用 '\n' 结束循环。

while (ch != '\n')

如果你一个字符一个字符地写,使用一个来退出你的序列(例如'@')

while (ch != '@')

【讨论】:

  • 感谢您的回复,但我无权拥有自己的退出角色。我只有一个长度未知的字符流,我想一个一个地读取这些字符,以便为我的场景处理它们会更容易
  • 一个一个说的意思是先写第一个字符,然后输入,然后第二个字符,然后输入...?或者你写完所有东西然后输入,但只是一个一个地阅读它们?如果是第二次使用 '\n'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多