std::getline 在最后一次出现定界符后跳过来自 std::cin 的输入,但不包含来自 std::istringstream 的输入
std::getline skipping input from std::cin after last occurrence of delimiter, but not with input from std::istringstream
我需要读取一些由空格分隔的输入,我为此使用的主要结构是:
while(std::getline(std::cin, s, ' ')){
std::cout << s << std::endl;
}
对于输入:"this is some text"
S 的输出将是:"this"、"is"、"some",从而跳过最后一个空格后的最后一段输入。
我也想在我的程序中包含最后一段输入,所以我去寻找解决方案并找到以下内容:
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
while (std::getline(iss, s, ' ')) {
std::cout << s << std::endl;
}
}
对于输入:"this is some text"
S 的输出将是:"this"、"is"、"some"、"text",这正是我想要的。
我的问题是:为什么从带分隔符的 std::cin 读取会跳过最后一次出现分隔符后的输入,而从 std::istringstream 读取却不会?
My question is: why does reading from std::cin
with a delimiter skip the input after the last occurrence of the delimiter, but reading from std::istringstream
does not?
没有。
在你的第一个例子中:
while(std::getline(std::cin, s, ' ')){
std::cout << s << std::endl;
}
您正在专门阅读由单个 space 逐字分隔的换行符中的项目。因为该行(表面上)以换行符结尾,所以它永远不会完成从输入字符串中提取,因为它期望 ' '
或 EOF。
在你的第二个例子中:
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
while (std::getline(iss, s, ' ')) {
std::cout << s << std::endl;
}
}
第一个 while 中的 std::getline
将从您的例句中 去除 换行符。然后根据一些基本规则提取项目。
规则如下(from cppreference):
Extracts characters from input and appends them to str until one of the following occurs (checked in the order listed)
a) end-of-file condition on input, in which case, getline sets eofbit.
b) the next available input character is delim, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input, but is not appended to str.
c) str.max_size() characters have been stored, in which case getline sets failbit and returns.
我需要读取一些由空格分隔的输入,我为此使用的主要结构是:
while(std::getline(std::cin, s, ' ')){
std::cout << s << std::endl;
}
对于输入:"this is some text"
S 的输出将是:"this"、"is"、"some",从而跳过最后一个空格后的最后一段输入。
我也想在我的程序中包含最后一段输入,所以我去寻找解决方案并找到以下内容:
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
while (std::getline(iss, s, ' ')) {
std::cout << s << std::endl;
}
}
对于输入:"this is some text"
S 的输出将是:"this"、"is"、"some"、"text",这正是我想要的。
我的问题是:为什么从带分隔符的 std::cin 读取会跳过最后一次出现分隔符后的输入,而从 std::istringstream 读取却不会?
My question is: why does reading from
std::cin
with a delimiter skip the input after the last occurrence of the delimiter, but reading fromstd::istringstream
does not?
没有。
在你的第一个例子中:
while(std::getline(std::cin, s, ' ')){
std::cout << s << std::endl;
}
您正在专门阅读由单个 space 逐字分隔的换行符中的项目。因为该行(表面上)以换行符结尾,所以它永远不会完成从输入字符串中提取,因为它期望 ' '
或 EOF。
在你的第二个例子中:
while (std::getline(std::cin, line)) {
std::istringstream iss(line);
while (std::getline(iss, s, ' ')) {
std::cout << s << std::endl;
}
}
第一个 while 中的 std::getline
将从您的例句中 去除 换行符。然后根据一些基本规则提取项目。
规则如下(from cppreference):
Extracts characters from input and appends them to str until one of the following occurs (checked in the order listed)
a) end-of-file condition on input, in which case, getline sets eofbit.
b) the next available input character is delim, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input, but is not appended to str.
c) str.max_size() characters have been stored, in which case getline sets failbit and returns.