如何解决C++中vector<string>处理输入字符串输出不完整的bug
问题根因
你的代码核心问题是字符串遍历结束后,最后一段非空格内容没有被存入vector:
- 遍历逻辑中只有遇到空格时才会触发将s2存入vector的操作,输入
Hello World遍历到最后一个字符d时,由于不是空格,只会被追加到s2中,随后直接触发continue,不会进入后续的push逻辑 - 循环结束后没有补充处理s2中剩余的内容,最终vector里只有
Hello这一个元素
修复方案
有两种常用修复方式:
方式1:循环结束后追加剩余内容
在for循环结束后,额外将s2中剩余的内容push进vector即可,修改后的完整代码如下:
#include <bits/stdc++.h> using namespace std; int main() { string s1; getline(cin, s1); vector<string> vs1; string s2; for (int i = 0; i < s1.size(); i++) { if (s1[i] != ' ') { s2.push_back(s1[i]); continue; } vs1.push_back(s2); s2.clear(); } // 新增:处理最后一段非空格内容 vs1.push_back(s2); for (string t : vs1) { cout << t << " "; } return 0; }
方式2:调整判断逻辑顺序
把判断是否要截断的逻辑放到最前面,避免continue跳过边界判断:
#include <bits/stdc++.h> using namespace std; int main() { string s1; getline(cin, s1); vector<string> vs1; string s2; for (int i = 0; i < s1.size(); i++) { // 先判断是否到了需要截断的位置 if (s1[i] == ' ') { vs1.push_back(s2); s2.clear(); continue; } s2.push_back(s1[i]); } vs1.push_back(s2); for (string t : vs1) { cout << t << " "; } return 0; }
额外优化提示
如果需要兼容连续多空格、首尾空格的场景,可以在push s2前加非空判断,避免存入空字符串。
内容的提问来源于stack exchange,提问作者Rishabh Rawat
相关产品推荐
相关产品推荐

