求助:如何用递归实现C++中的句子拆分(字符串分割)?
递归实现字符串拆分功能
先贴出你已经实现的循环版拆分代码(修正了C++中字符串长度的正确写法s.length()):
#include <string> using namespace std; string strings[10]; void split(string s){ int curr=0,start=0,end=0,i=0; while(i<=s.length()){ if(s[i]==' ' or i == s.length()){ end = i; string sub; sub.append(s,start,end-start); strings[curr] = sub; start = end + 1; curr += 1 ; } i++; } }
针对你的需求,以下是递归版本的实现,逻辑和循环版保持一致,能处理输入前后空格、中间连续空格的情况:
#include <string> using namespace std; string strings[10]; // 递归辅助函数,处理当前子串并维护数组索引 void splitRecursive(const string& s, int curr) { size_t spacePos = s.find(' '); // 没有找到空格,处理最后一段子串 if (spacePos == string::npos) { if (!s.empty()) { strings[curr] = s; } return; } // 提取第一个空格前的子串 string sub = s.substr(0, spacePos); // 非空才存入数组(跳过开头空格产生的空串) if (!sub.empty()) { strings[curr] = sub; curr++; } // 跳过当前空格后的连续空格 size_t nextStart = spacePos + 1; while (nextStart < s.size() && s[nextStart] == ' ') { nextStart++; } // 递归处理剩余子串 splitRecursive(s.substr(nextStart), curr); } // 对外调用接口,初始化处理 void split(const string& s) { // 重置数组,避免之前的残留数据 for (int i = 0; i < 10; i++) { strings[i].clear(); } // 跳过输入开头的连续空格 size_t start = 0; while (start < s.size() && s[start] == ' ') { start++; } splitRecursive(s.substr(start), 0); }
实现说明
- 对外的
split函数先处理输入开头的空格,避免递归时生成空串,同时重置结果数组确保数据干净。 - 递归辅助函数
splitRecursive每次只处理当前子串的第一个分隔符:- 找到第一个空格后,提取前面的有效子串存入数组;
- 跳过后续的连续空格,避免生成空元素;
- 对剩余的子串重复上述过程,直到没有空格为止,处理最后一段子串。
测试输入" computer laptop screen desktop mouse "后,strings数组的前5个元素会依次是computer、laptop、screen、desktop、mouse,和循环版输出一致。
内容的提问来源于stack exchange,提问作者Haresh Dinakar
相关产品推荐
相关产品推荐

