为什么不用stringstream时getline代码无法运行?如何用stringstream修复?
问题成因
原代码无法编译的核心原因是getline接口的参数不符合要求:
- 全局
getline函数的第一个参数必须是输入流类型(比如cin、文件流、字符串流),原代码在循环里写getline(randomwords,temp,' ')时,第一个参数传入的是std::string类型的普通字符串变量,不属于输入流,编译器会直接报参数类型不匹配的错误。 std::string仅作为字符串内容的存储容器,本身不支持流式的按分隔符逐段读取能力,要实现从已存储的字符串中拆分内容,需要用<sstream>头文件提供的std::stringstream,它可以把普通字符串包装成和cin行为逻辑一致的输入流,支持getline按指定分隔符读取片段。
修正后代码
#include <iostream> #include <string> #include <sstream> // 必须引入stringstream对应的头文件 using namespace std; int main() { string randomwords, temp; // 读取用户输入的整行文本 getline(cin, randomwords); // 将读取到的整行文本包装为字符串输入流 stringstream word_stream(randomwords); // 从字符串流中以空格为分隔符,逐段读取每个单词 while (getline(word_stream, temp, ' ')) { cout << temp << endl; } return 0; }
使用说明
- 不要漏写
<sstream>头文件,否则编译器无法识别stringstream类型,依然会编译失败。 - 上述代码逻辑完全匹配预期功能:先读取整行用户输入,再按空格拆分,拆分得到的每个单词会逐行打印输出。
- 如果输入存在连续多空格的情况,该写法会在连续空格之间输出空行,如果需要过滤空内容,可以在循环里加判断,
temp非空的时候再输出即可。
内容的提问来源于stack exchange,提问作者Henryychangg
相关产品推荐
相关产品推荐

