【问题标题】:User input and fgets用户输入和 fget
【发布时间】:2015-12-17 05:15:56
【问题描述】:

我必须接受用户输入并将其写入文件,为此我使用fgets() 来防止溢出:

while (fgets( line, sizeof line, stdin) != NULL)
    fputs(line, file);

这样做的问题是用户必须在一个空行上输入 CTRL+Z 然后提交它以退出输入,这可能看起来有点混乱。有没有更简单的方法可以退出fgets() 输入?

其他方法呢?如果我逐个符号地读取,我可以实现一个退出字符,但用户不能删除输入,这也很混乱,所以我必须实现一个删除算法,这给代码增加了一点复杂性。

编辑: 用户必须能够在终端中输入 C 代码,并且限制尽可能少。

【问题讨论】:

  • 在 Linux 上像 char 一样工作。也许你有一些奇怪的 IDE 或操作系统?而fgets 不允许编辑。 stdin 是一个字符流!
  • 这个想法是能够非常轻松地退出输入(可能是特定的退出字符),而我不能用 fgets 做到这一点。

标签: c fgets


【解决方案1】:

为什么不使用输入值本身来实现检查呢?这样,您将不需要任何 特殊 实现来标记输入的结束。

详细来说,如果你想用空行来标记输入的结束,你可以检查输入缓冲区的第一个元素是否等于换行符来实现break条件,比如

    while (fgets( line, sizeof line, stdin) != NULL)
    {
            if (line[0] == '\n')
            {
                    printf("end\n");
                    break;
            }
               fputs(line, file);
    }

编辑:如果您想实现自己的输入结束标记,您可以使用该特定标记与第一个元素进行比较(或者,如果它是多字母标记,则可能是 strcmp() 与输入) 来实现break

【讨论】:

  • 这不允许空行,用户可能希望有一个空行。
  • @user3604097 我没有注意到这是您要求的一部分。
  • 我忘了说,不过大体思路是让用户能够在终端窗口中输入C代码。
  • @user3604097 检查更新的答案。希望您有根据自己的需要调整逻辑的想法。
  • 是的,我可以告诉用户写“exit”,然后对其执行 strcmp。它仍然有点太复杂,但我想这是 fgets 的唯一方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多