C++将vector结构体的char转string异常:仅存首个字符求助
问题分析与解决方案
嘿,我之前也踩过stringstream的这个坑!你的问题根源在于stringstream的状态没有被重置,导致后续的输入操作全部失效了。
为什么target一直是A?
第一次循环时,你把musc.code(也就是A)写入stringstream,然后用ss >> target把A读出来。这时候stringstream已经到达了流的末尾,它的eofbit(文件结束标志)会被置为true。
在后续的循环里,哪怕你继续执行ss << musc.code写入B、C这些字符,因为stringstream处于错误状态(eofbit为true),所有的输入输出操作都会被直接忽略。所以ss >> target根本不会读取新的字符,target自然一直停留在第一次的A。
解决方案1:每次循环新建stringstream
最简单的办法就是把stringstream的声明放到循环内部,这样每次迭代都会创建一个全新的流,不会有状态残留:
for (Musician musc : aMusician) { std::stringstream ss; // 每次循环新建流 std::string target; ss << musc.code; ss >> target; if (target.find(variable1.at(0)) != std::string::npos) { // 你的业务代码 } }
解决方案2:重置现有stringstream的状态和内容
如果你想复用同一个stringstream,那每次循环都要手动清空内容并重置错误标志:
std::stringstream ss; std::string target; for (Musician musc : aMusician) { ss.str(""); // 清空流中的所有内容 ss.clear(); // 重置eofbit、failbit等错误标志 ss << musc.code; ss >> target; if (target.find(variable1.at(0)) != std::string::npos) { // 你的业务代码 } }
更简洁的优化:直接将char转为string
其实根本不需要用stringstream来做这个转换,直接用string的构造函数就能一步到位,既高效又不会有流状态的问题:
for (Musician musc : aMusician) { std::string target(1, musc.code); // 用单个char构造string if (target.find(variable1.at(0)) != std::string::npos) { // 你的业务代码 } }
内容的提问来源于stack exchange,提问作者DickChang
相关产品推荐
相关产品推荐

