【问题标题】:multiline input reading input from stdin in C多行输入从 C 中的标准输入读取输入
【发布时间】:2011-10-10 19:29:03
【问题描述】:

大家好,我想问一下,在 c 编程中有没有一种方法可以从标准输入读取多行输入

因为我不能使用 scanf() 也不是 fgets,因为它需要输入直到 /n

还有如何像一些分隔符一样停止输入

非常感谢

我也没有使用 c++

【问题讨论】:

    标签: c line stdin


    【解决方案1】:

    使用fread

    例如,从链接复制

    #include <stdio.h>
    ...
    size_t bytes_read;
    char buf[100];
    FILE *fp;
    ...
    bytes_read = fread(buf, sizeof(buf), 1, fp);
    ...
    

    【讨论】:

    • 如果 OP 自己扫描分隔符,这实际上可能是最快的。
    • 如果您想从流中读取未知数量的字符,fread 将无法正常工作。
    • @Banthar:实际上它在这种情况下工作得很好。使用fread(和fwrite)编写文件复制程序非常容易。这样的程序复制单字节文件以及几兆字节的文件。
    • @pmg 是的,但是很难编写一个程序来读取所有内容,直到某个字符为止,仅此而已。这是您在交互式程序中想要的。
    • 啊!我同意你的看法,@Banthar。之前不太明白你的意思。供您参考,Zack's answer(和getc)被我投票赞成。
    【解决方案2】:

    我建议您使用getc 一次读取一个输入字符,查找所需的任何分隔符,并将非分隔符字符附加到您手动控制大小的缓冲区(使用realloc)。另一种方法是使用fread 读取大块并扫描分隔符,但getc 方法可能更容易和更简单。

    确保查找EOF 以及您的显式分隔符。

    【讨论】:

      【解决方案3】:

      如果 C 中有适当的字符串数据类型,并且具有自动内存管理功能,那么这项任务将非常简单。这个想法是:

      string s = str_new();
      const char *delimiter = "EOF\n";
      while (true) {
        int c = fgetc(f);
        if (c == EOF) {
          break;
        }
        str_appendc(s, c);
        if (str_endswith(s, delimiter)) {
          str_setlen(s, str_len(s) - strlen(delimiter));
          break;
        }
      }
      

      您只需为字符串处理编写适当的函数。

      【讨论】:

        最近更新 更多