【问题标题】:C++ how to remove blank lines at the end of input?C ++如何删除输入末尾的空白行?
【发布时间】:2020-01-19 18:20:12
【问题描述】:

我有一个家庭作业,我需要创建一个过滤器来删除 cin 开头和结尾处的空行。显然,开始很容易,但我在结束时被难住了。我想使用动态数组,但这是不允许的......

这是练习文本:

在本练习中,开发一个过滤器,用于删除存在于 cin 的开头和 cin 的结尾。如果一行不为空 至少包含一个非空白字符。如果空行包含 空白字符,然后在写入时可以忽略这些字符 该空行到标准输出流。

注意事项:我们尚未涵盖大小未定的数组,因此您 不能将行存储在数组中,并且您不应该采用 Perl 方法,你首先读入完整文件,然后处理 你有什么。使用 std::string 变量是可以的,但该变量 从标准输入读取的行数不得超过一行。

我完全不知道你怎么能知道它最后是一个空白行而不知道还有什么输入。如果有任何帮助或提示可以为我指明正确的方向,我将不胜感激。

我还有第二个较小的问题。它说的是文件,但这是否意味着它只需要使用输入文件?截至目前,我只能使其适用于手动输入(以某些特殊字符组合结束输入)或仅扫描新行(仅适用于文件)。有没有办法在这两种情况下以相同的方式结束扫描? (我只是在使用while循环atm)

当我们谈到它时,我对措辞有点困惑。是否应该打印仅包含空白字符的行,或者将其视为空白行并跳过?

提前致谢!

【问题讨论】:

  • 请在代码中提供您目前所做的工作。
  • @TedLyngmo 我认为这里没有必要。问题更多的是算法而不是代码。
  • 那么我猜它应该被标记为与语言无关而不是 C++?
  • @TedLyngmo 同时,它与流等 C++ 特性相关联。
  • 现在,在我见过的大多数文档中,即使 FILE* 也被称为流。 :-)

标签: c++ input filter


【解决方案1】:

由于这是家庭作业,我会就算法提出建议,但不提供代码(这会删除练习的重点)。

开头和结尾的空白行必须删除,但中间的空白行必须保留。您只能缓存一行输入。想一想:你需要缓存一个空行来打印它吗?或者你可以打印这样一行(或许多这样的行)而不缓存它们吗?在一个或多个空行的块之后必然会出现什么?

如果这些提示对你来说还不够,这里是算法:

cin 一次读取一行。如果不为空,请打印。如果它是空的,请记住您遇到了一个空行。继续阅读,只要连续的行是空白的,就继续增加空白行计数器。最终,你要么打到一个非空的孤单,要么打到 EOF。如果EOF,简单地结束。如果是非空行,则输出counter空行,并重置counter


关于另一个问题:C++ 将文件抽象为输入(或输出)的。流以到达 EOF(文件结尾)结束。 std::cin 只是一个特定的流(从std::istream 子类化),std::ifstream 也是如此。你也永远不知道std::cin是来自键盘还是来自文件(使用例如shell重定向),你也不应该关心。只需将代码写入流接口即可。请注意,也可以在交互式输入上发送 EOF;例如,在 Linux 中,它是通过按 Ctrl+D 来完成的。

【讨论】:

  • 显示/隐藏功能是在标记中使用>! 的结果吗?
  • @RSahu 是的;故意使用。
  • 很高兴知道。希望我会在需要时记住它:)
  • @RSahu 如果没有,请转到scifi.stackexchange.com 并浏览几个问题,您很可能迟早会遇到这个 spolier 标记。
  • @Brian 你不必是天生的;程序员的直觉可以通过练习得到训练。