为何移除ss>>ch后,stringstream遍历字符串仅输出首个数值?
问题解析:stringstream读取逗号分隔整数的行为差异
先看一下你的代码:
#include <sstream> #include <iostream> using namespace std; int main() { stringstream ss; string st = "2,3,55,33,1124,34"; int a; char ch; ss.str(st); while(ss >> a) { cout << a << endl; ss >> ch; } return 0; }
咱们来一步步拆解为什么移除ss >> ch后只输出2:
- stringstream的
>>运算符特性:当你用ss >> a读取整数时,它会从当前流位置开始,跳过前导空白(这里没有空白),然后持续读取数字字符,直到遇到非数字字符为止。此时,这个非数字字符会留在流的当前位置,不会被消耗。 - 没有
ss >> ch的情况:- 第一次循环:
ss >> a成功读取到2,此时流的指针停在了第一个逗号,的位置。 - 第二次循环判断
ss >> a时,流的当前字符是逗号,这不是整数的有效起始字符,所以读取操作失败,while循环的条件返回false,直接终止循环。因此你只能看到输出2。
- 第一次循环:
ss >> ch的作用:
它的任务就是把留在流里的那个逗号给“吃掉”——也就是读取并消耗掉这个非数字的分隔符,让流的指针移动到逗号后面的下一个数字字符位置。这样下一次循环的ss >> a就能顺利读取到下一个整数,直到所有数字都被处理完。
简单说,ss >> ch就是专门处理逗号这个分隔符的“清理工”,确保每次读取整数前,流的位置都在有效数字的起始处。
内容的提问来源于stack exchange,提问作者Kulten
相关产品推荐
相关产品推荐

