去除元音后单词首字母大写的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; }
关键修正点
- 初始标记设置:将
is_new_word初始值设为1,确保字符串开头的第一个非元音字符会被识别为单词首字母并大写。 - 元音处理逻辑:遇到元音字符时不修改
is_new_word状态,保证单词开头的元音被跳过之后,后续的非元音字符仍能触发首字母大写逻辑。
测试验证
- 输入
I am Iron Man:输出M Rn Mn,符合预期; - 输入
I am Iron Man:输出M Rn Mn,符合预期。
内容的提问来源于stack exchange,提问作者Dave Balanghig
相关产品推荐
相关产品推荐

