You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中不使用stringstream和strtok拆分字符串(提取单词)?

解决多空格/跨行字符串拆分问题

问题分析

你的原代码只处理了单个空格的情况,当遇到多个连续空格、换行符或者行首空白时就会失效——要么把空字符串加入列表,要么把换行符包含进单词里,完全不符合预期。

推荐解决方案:使用字符串流(istringstream)

C++的<sstream>库提供的istringstream可以自动忽略所有空白字符(包括空格、换行、制表符等),非常适合这种场景,代码简洁且不易出错:

#include <iostream>
#include <vector>
#include <sstream>
#include <string>

using namespace std;

int main() {
    // 模拟包含多空格、跨行、行首空白的输入字符串
    string input = "Alice   Bob\n  Charlie David  \nEve";
    vector<string> names;
    string word;
    
    // 将输入字符串传入字符串流
    istringstream iss(input);
    
    // 每次读取一个非空白的单词,自动跳过所有空白
    while (iss >> word) {
        names.push_back(word);
    }
    
    // 验证结果
    for (const auto& name : names) {
        cout << name << endl;
    }
    return 0;
}

为什么这个方法有效?

istringstream的>>运算符默认会跳过任意数量的空白字符,直接读取到下一个非空白字符开始的完整单词,直到遇到下一个空白为止。不管是多个连续空格、换行还是行首的空白,都会被自动忽略,完美匹配你的需求。

备选方案:手动处理空白字符

如果你不想用字符串流,也可以手动遍历字符串,跳过空白后截取单词:

#include <iostream>
#include <vector>
#include <string>
#include <cctype> // 用于判断空白字符的isspace函数

using namespace std;

int main() {
    string input = "Alice   Bob\n  Charlie David  \nEve";
    vector<string> names;
    size_t start = 0;
    const size_t input_len = input.size();
    
    while (start < input_len) {
        // 第一步:跳过当前位置所有的空白字符
        while (start < input_len && isspace(input[start])) {
            start++;
        }
        if (start >= input_len) break; // 已经到字符串末尾,退出循环
        
        // 第二步:找到当前单词的结束位置(下一个空白字符的位置)
        size_t end = start;
        while (end < input_len && !isspace(input[end])) {
            end++;
        }
        
        // 第三步:截取单词并加入列表
        string word = input.substr(start, end - start);
        names.push_back(word);
        
        // 更新start到当前单词的下一个位置,继续循环
        start = end;
    }
    
    // 验证结果
    for (const auto& name : names) {
        cout << name << endl;
    }
    return 0;
}

手动处理的逻辑说明

  1. 先跳过所有开头的空白(包括空格、换行),确保start指向单词的第一个字符。
  2. 找到单词的结束位置(下一个空白的位置),截取中间的子串作为单词。
  3. 更新start到结束位置,重复上述步骤直到遍历完整个字符串。

原代码的问题所在

你的原代码用find_first_of(" ")只查找单个空格,不会识别换行符,而且遇到多个连续空格时,下一次循环会截取到空字符串(因为input.substr(0, index)中index是下一个空格的位置,此时从0到index的子串为空),这就是它处理不了复杂场景的原因。

内容的提问来源于stack exchange,提问作者Sdiii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:03:03