【问题标题】:C++: Why won't getline() print the last word of the input string?C++:为什么 getline() 不打印输入字符串的最后一个单词?
【发布时间】:2015-09-08 08:02:24
【问题描述】:

我试图让我的程序读取一个字符串,然后在单独的行上输出每个单词。当我调用此函数时,它不会打印句子的最后一个单词。我一直无法找到这个问题的答案。

例如:

输入:

朋友你好

输出:

你好

那里

我的

这是我的代码:

istream& operator >> (istream& in, FlexString& input) {
    std::string content;
    while (std::getline (in,content,' ')) {
        cout << content << endl;
    }

    return in;
}

我是 C++ 新手,所以这可能很愚蠢,但我尝试在 while 循环之后的下一行添加另一个 cout 调用以打印 content 但它不会打印它某种原因。

【问题讨论】:

  • 我尝试在一个测试程序中运行它,它仍然打印与以前相同的结果。命令行在打印倒数第二个单词后似乎挂起,并且似乎没有完成代码处理。

标签: c++ class output getline istream


【解决方案1】:

getline 没有跳过最后一个字。它还在等你完成它。您选择了空格字符 (' ') 作为分隔符,因此 getline 将读取直到找到空格(不是制表符或换行符),或者直到输入流结束。您的循环也不会像您预期的那样在行尾停止。它将继续读取直到流结束。

如果您想读取一行,然后逐字分隔该行,则只需调用一次getline,并使用\n 分隔符(这是默认值)。然后使用istringstream 逐字分隔生成的字符串。

std::string line;
std::getline(in, line);
std::istringstreaam iss(line);
std::string content;
while (iss >> content)
    std::cout << content << std::endl;

【讨论】:

  • 看看 Kerreks 的评论。它正在 IDEone 上运行,所以你的论证一定有问题(或者它是一些编译器特定的东西)
  • @tobi303:当然它在 IDEone 上运行。它也在OP的计算机上工作。他只是不明白 getline 是做什么的。
  • @tobi303:更清楚地说,在 IDEone 上,Kerrek 将一行传递给标准输入,然后终止它。 getline 在终止时停止读取。但是对于 OP,标准输入来自键盘。他(我猜)希望当他按下回车键时它会被终止,但事实并非如此。它只是继续等待他输入。
  • "错误:',' 标记之前的预期主表达式 std::getline(istream, line);"哦,我现在知道我应该使用 'in' 代替 'istream'。
  • @CameronO'Reilly:是的,代码假定在名为istream 的范围内有一个std::istream。我更改了它以匹配您的代码。
猜你喜欢
  • 2013-09-28
  • 2013-07-08
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2021-07-03
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多