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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:06:02