在我看来,std::getline 没有正确处理新行?



使用下面的代码,我希望用户在终端中写一个文本,然后打印出文本的最后一句话。也许我应该提一下,我在Linux桌面上运行。

#include <string>
#include <iostream> 
int main()
{
std::string user_text{};
while(std::getline(std::cin, user_text))
{
}
std::cout << "Text: " << user_text << std::endl;
return 0;
}

无论如何,如果我在运行程序后,写下例如:

嗨,我叫

然后按"ctrl+d",输出确实是"Text: Hi my name is"

然而,如果我改为这样做:

嗨,我的名字是"按回车">

Name my is hi‘press enter’

然后按"ctrl+d"。输出为"Text: "。为什么会这样?当我按下"ctrl+d"时,getline不应该停止吗?

提前感谢!

std::getline()在尝试从流中读取之前擦除输出std::string

在第二种情况下,对std::getline()的前两次调用已经读取了您键入的所有内容,当您在第三次调用中按CTRL-D时,没有任何内容可供std::getline()输出到std::string

将最后一个成功读取的行保存到一个单独的变量中,例如:

std::string user_text, line;
while(std::getline(std::cin, line))
{
user_text = line;
}
std::cout << "Text: " << user_text << std::endl;

std::getline正在按预期工作:它正在获取一行。如果按enter键,它将创建一个新的空行;如果按ctrl+d,则终止std::getline,返回该(空(行的内容。

来自文档:

getline从输入流中读取字符并将其放入字符串中:

  1. 行为为UnformattedInputFunction,但input.gcount((不受影响。构造并检查哨兵对象后,执行以下操作:
    1. 调用str.erases((
    2. 从输入中提取字符并将其附加到str,直到出现以下情况之一(按列出的顺序选中(a( 输入的文件结束条件,在这种情况下,getline设置eofbit。b( 下一个可用的输入字符是delim,正如Traits::eq(c,delim(测试的那样,在这种情况下,分隔符是从输入中提取的,但不会附加到str中。c( str.max_size((字符已经存储,在这种情况下,getline设置failbit并返回
    3. 如果由于任何原因(甚至不是丢弃的分隔符(没有提取任何字符,getline将设置故障位并返回
  2. 与getline(input,str,input.wrade('\n'((相同,即默认分隔符为换行符

Ctrl+D使进程的read从终端立即返回。如果在键入:Hi my name is后按Ctrl+D,则过程将显示:Hi my name isgetline将找不到n,并将重新开始读取。然后你第二次按下Ctrl+D(你没有说,但我相信你说了(。这将中断read,使其返回0,这就好像终端关闭了一样。getline将返回当前值:Hi my name is

在第二种情况下,自上次n以来,您没有键入任何内容,因此当您按Ctrl+D时,read直接返回0,getline返回一个空字符串。

最新更新