C++实现单词连字符规则:如何将指定字符序列识别为单个辅音
解决规则3:将特殊字符序列作为单个辅音处理的方案
现有代码问题
你当前的isSpecialCharSequence存在三个核心问题:
- 逻辑写反:匹配到指定特殊序列时应该返回
true(是特殊序列),你当前实现返回了false - 未处理最长的3字符特殊序列
str,也没有边界检查容易出现越界访问 - 仅返回布尔值无法告诉遍历逻辑要跳过几个字符,自然没法把多字符序列当作单个单位处理
实现思路
核心是修改特殊序列判断函数,返回值改为int类型:匹配到3字符序列返回3、匹配到2字符序列返回2、未匹配到特殊序列返回1,遍历字符串时直接按返回值跳步,就能把多字符序列当作单个辅音处理。
修正后代码实现
#include <cctype> #include <cstring> // 输入:字符串、当前索引、字符串总长度 // 返回:当前位置开始的特殊辅音序列长度,1表示普通单字符 int getSpecialConsonantLen(const char* input, int index, int totalLen) { // 边界检查,避免越界 if (index >= totalLen) return 0; // 优先匹配最长的3字符序列str,避免和st序列冲突 if (index + 2 < totalLen) { char c0 = tolower(input[index]); char c1 = tolower(input[index+1]); char c2 = tolower(input[index+2]); if (c0 == 's' && c1 == 't' && c2 == 'r') return 3; } // 匹配2字符特殊序列 if (index + 1 < totalLen) { char c0 = tolower(input[index]); char c1 = tolower(input[index+1]); if ( (c0 == 'q' && c1 == 'u') || (c0 == 't' && c1 == 'r') || (c0 == 'b' && c1 == 'r') || (c0 == 's' && c1 == 't') || (c0 == 's' && c1 == 'l') || (c0 == 'b' && c1 == 'l') || (c0 == 'c' && c1 == 'r') || (c0 == 'p' && c1 == 'h') || (c0 == 'c' && c1 == 'h') ) { return 2; } } return 1; }
遍历使用示例
遍历的时候不要用i++,每次按返回的序列长度跳步即可:
void splitWord(const char* word) { int len = strlen(word); int i = 0; while (i < len) { int seqLen = getSpecialConsonantLen(word, i, len); // 此处直接把长度为seqLen的序列当作单个辅音处理即可 // 所有返回seqLen>1的序列都直接判定为辅音,不需要再单独检查内部字符的元音属性 i += seqLen; } }
内容的提问来源于stack exchange,提问作者cplusplusisgross
相关产品推荐
相关产品推荐

