我有一个家庭作业练习,需要创建一个过滤器,以删除 cin 开头和结尾的空白行。显然,开始很容易,但我却为之困惑。我想使用动态数组,但这是不允许的...
以下是练习文本:
在本练习中,开发一个过滤器,以删除存在于以下位置的空行 cin的开始和结束。如果一行不为空 包含至少一个非空白字符。如果包含空行 空白字符,则在编写时可以忽略这些字符 空行到标准输出流。
注意事项:我们尚未涵盖尺寸不确定的阵列,因此您 不能将行存储在数组中,因此您不应该采用 Perl方法,首先读取完整文件,然后处理 你有什么。使用std :: string变量可以,但是该变量 从标准输入中读取的内容不得超过一行。
我完全不知道您如何才能知道结尾处是空白行而又不知道还要输入什么。如果有任何帮助或提示,可以为我指明正确的方向。
我还有第二个较小的问题。它说的是文件,但这是否意味着它只需要使用输入文件?到目前为止,我只能使它适用于手动键入(通过某些特殊的字符组合结束输入)或仅扫描换行(仅适用于文件)。在这两种情况下,有什么方法可以结束以相同的方式进行扫描? (我只是在使用while循环atm)
在我们讨论时,我对措辞感到困惑。是仅包含空白字符的行应该被打印,还是被视为空白行并被跳过?
提前谢谢!
答案 0 :(得分:4)
由于这是家庭作业,因此我将提供有关算法的建议,但不提供代码(这将消除练习的重点)。
必须删除开头和结尾处的空白行,但必须保留中间的空白行。您只能缓存一行输入。考虑一下:您是否需要缓存一个空行才能打印出来?还是可以在不缓存它们的情况下打印这样的一行(或许多这样的行)?在一个或多个空白行的块之后必然发生什么?
如果这些提示对您来说还不够,请使用以下算法:
一次从
cin
中读取一行。如果不为空,请打印。如果为空,请记住您遇到了一个空白行。继续阅读,只要连续的行为空白,请继续增加空白行计数器。最终,您将击中非空的孤行或EOF。如果是EOF,只需结束。如果为非空行,则输出counter
空行,并重置counter
。
关于另一个问题:C ++将文件抽象为输入(或输出)的流。流到达EOF(文件结束)而结束。 std::cin
和std::istream
一样,只是一个特定的流(从std::ifstream
继承而来)。您也永远不会知道std::cin
是来自键盘还是来自文件(例如,使用Shell重定向),而且您也不在乎。只需将代码编写到流接口即可。请注意,也有可能在交互式输入上发送EOF。例如,在Linux中,可以通过按 Ctrl + D 来完成。