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

C++字符串分词代码问题:未处理第二个Token提前终止

问题分析与解决方案

我注意到你在编写带空格处理的C++字符串分词代码时,遇到了程序在处理第二个Token前就提前终止的问题。先帮你梳理核心问题,再给出修复后的完整代码。

核心问题点

  • 未完成的输入处理:如果只使用cin >> s会在第一个空格处停止读取,后续分词逻辑直接出错;如果是cin.getline但之前残留了换行符,也会读取空字符串。
  • 未实现count_spaces函数:编译器会因找不到函数定义报错,直接导致程序无法正常运行。
  • 全局变量滥用:p和next_token作为全局变量容易导致逻辑混乱,指针偏移处理不当会提前走到字符串末尾。

修复后的完整代码

#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;

// 统计字符串中的空格数量
int count_spaces(const char *p) {
    int count = 0;
    while (*p != '\0') {
        if (*p == ' ') {
            count++;
        }
        p++;
    }
    return count;
}

// 自定义分词函数,按空格分割返回下一个Token
char* get_next_token(char *str) {
    static char *next_token = nullptr;
    // 首次调用时初始化起始指针
    if (str != nullptr) {
        next_token = str;
    }
    // 已到字符串末尾则返回空
    if (next_token == nullptr || *next_token == '\0') {
        return nullptr;
    }
    // 跳过Token开头的连续空格
    while (*next_token == ' ') {
        next_token++;
        if (*next_token == '\0') {
            return nullptr;
        }
    }
    // 标记当前Token的起始位置
    char *token_start = next_token;
    // 找到下一个空格或字符串末尾
    while (*next_token != '\0' && *next_token != ' ') {
        next_token++;
    }
    // 用结束符分割当前Token,同时移动指针到下一个Token起始位置
    if (*next_token != '\0') {
        *next_token = '\0';
        next_token++;
    }
    return token_start;
}

int main() {
    char s[81];
    cout << "Input a string : ";
    // 读取整行输入(包含空格)
    cin.getline(s, 81);
    
    // 输出空格统计结果
    int space_count = count_spaces(s);
    cout << "Total spaces in string: " << space_count << endl;
    
    // 分词并逐个输出Token
    cout << "Tokens in string:" << endl;
    char *token = get_next_token(s);
    while (token != nullptr) {
        cout << "- " << token << endl;
        token = get_next_token(nullptr);
    }
    
    return 0;
}

代码说明

  • 输入处理优化:用cin.getline(s, 81)读取整行内容,确保捕获所有空格,避免cin >> s只读取第一个空格前内容的问题。
  • 空格统计函数实现:遍历字符串逐个判断字符,完成最初需求的空格统计功能。
  • 分词逻辑修复:用静态变量next_token记录下一个Token的起始位置,跳过前置空格、分割Token的逻辑确保能依次获取所有内容,不会提前终止。
  • 减少全局变量:把next_token放在分词函数内作为静态变量,避免全局变量带来的逻辑混乱。

替换这段代码后,编译运行就能正常处理带空格的字符串分词,不会出现提前终止的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:08