能否使用istringstream读取多参数?如何向nameStream加参数并分隔?
C++ istringstream 使用问题解答
用户问题
是否可以使用
istringstream读取流中的多个参数?另外,能否不创建新的istringstream对象,而是向已有的nameStream中追加另一个字符串参数?我编写了如下代码,若该方法可行,能否让输入流以空格或换行符分隔两个全名?
原代码(存在错误)
#include <iostream> #include <string> using namespace std; string lastNameFirst (string fullname){ fullname = "Don Blaheta"; fullname2 = "Julian Dymacek"; istringstream nameStream(fullname, fullname2); string firstName; string lastName; string firstName2; string lastName2; nameStream>>firstName>>lastName>>firstName2>>lastName2; return 0; }
问题分析与解答
先指出原代码的几个明显错误:
- 缺少
<sstream>头文件:istringstream的定义在这个头里,必须包含 - 未声明
fullname2变量:使用前需要先定义 istringstream构造不支持双字符串参数:只能用单个字符串初始化缓冲区- 返回类型不匹配:函数声明返回
string,但返回0(整数)
接下来逐个回答你的问题:
能不能用istringstream读取多个参数?
当然可以。istringstream的>>运算符默认会以空白字符(空格、换行、制表符等)作为分隔符,只要流缓冲区里有足够的内容,就能连续读取多个字符串变量,比如你代码里的firstName、lastName等。能不能向已有的istringstream追加内容,不用新建对象?
可以,但不能像你那样在构造时传两个字符串。有两种常用方法:
- 用
str()方法获取当前流的字符串内容,拼接新内容后重新设置:nameStream.str(nameStream.str() + " " + fullname2); - 直接用
<<运算符向流中写入新内容,但要注意写完后需要把读取位置指针重置到流的开头,否则后续读取会从末尾开始,读不到内容:nameStream << " " << fullname2; nameStream.seekg(0); // 重置读取位置到开头
- 输入流能不能用空格或换行分隔两个全名?
完全没问题。>>运算符本身会自动忽略所有空白字符,不管两个全名之间是空格、换行还是制表符,都能正确拆分出四个名字部分。
修正后的代码示例
#include <iostream> #include <string> #include <sstream> // 必须包含的头文件 using namespace std; string lastNameFirst() { string fullname = "Don Blaheta"; string fullname2 = "Julian Dymacek"; // 初始化istringstream istringstream nameStream(fullname); // 追加第二个全名,用空格分隔(换成"\n"换行也可以) nameStream << " " << fullname2; // 重置读取位置到流的开头 nameStream.seekg(0); string firstName, lastName, firstName2, lastName2; // 连续读取,自动忽略空白分隔符 nameStream >> firstName >> lastName >> firstName2 >> lastName2; // 返回符合类型要求的字符串(示例为姓氏在前的格式) return lastName + ", " + firstName + " | " + lastName2 + ", " + firstName2; } int main() { cout << lastNameFirst() << endl; return 0; }
运行这段代码会输出:Blaheta, Don | Dymacek, Julian
内容的提问来源于stack exchange,提问作者Aquarus
相关产品推荐
相关产品推荐

