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

去除元音后单词首字母大写的C语言代码问题排查

C语言字符串处理问题修正:删除元音并单词首字母大写

问题现象

现有代码实现删除字符串中的元音,并将每个单词首字母转为大写,但存在逻辑缺陷:

  • 当输入字符串带开头空格(如 I am Iron Man)时,输出M Rn Mn符合预期;
  • 当输入字符串开头无空格(如I am Iron Man)时,输出为m Rn Mn,不符合预期(预期应为M Rn Mn)。

问题原因

代码中标记“新单词开头”的变量初始值设为0,导致字符串开头的第一个非元音字符无法被识别为单词首字母,进而未执行大写转换。此外,遇到元音字符时未保留“新单词开头”的标记,使得单词开头的元音被跳过之后,后续的非元音字符也无法触发大写逻辑。

修正方案

调整“新单词开头”标记的初始值,并优化元音字符处理时的标记状态:

#include <stdio.h>
#include <ctype.h>

// 判断是否为元音字符
int is_vowel(char c) {
    c = tolower(c);
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

int main() {
    char str[] = "I am Iron Man";
    char result[100];
    int i = 0, j = 0;
    int is_new_word = 1; // 初始化为1,默认开头即为新单词

    while (str[i] != '\0') {
        if (str[i] == ' ') {
            result[j++] = ' ';
            is_new_word = 1; // 空格后标记为新单词开头
            i++;
        } else if (is_vowel(str[i])) {
            i++; // 跳过元音,保留新单词标记状态
        } else {
            if (is_new_word) {
                result[j++] = toupper(str[i]);
                is_new_word = 0; // 首字母处理后,取消新单词标记
            } else {
                result[j++] = tolower(str[i]);
            }
            i++;
        }
    }
    result[j] = '\0';
    printf("%s\n", result); // 输出:M Rn Mn
    return 0;
}

关键修正点

  1. 初始标记设置:将is_new_word初始值设为1,确保字符串开头的第一个非元音字符会被识别为单词首字母并大写。
  2. 元音处理逻辑:遇到元音字符时不修改is_new_word状态,保证单词开头的元音被跳过之后,后续的非元音字符仍能触发首字母大写逻辑。

测试验证

  • 输入I am Iron Man:输出M Rn Mn,符合预期;
  • 输入 I am Iron Man:输出M Rn Mn,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:55:26