C语言camelCase函数问题:处理下划线后出现重复字符
问题分析与代码修正
你的代码出现rrandomWwordPprovided这类重复字符的核心原因是下划线处理时未移除重复字符,同时存在开头特殊字符未清理、逻辑顺序混乱的问题,具体问题点和修正方案如下:
原代码的关键bug
- 下划线处理导致字符重复:当检测到
_时,你将当前位置替换为下一个字符的大写,但原位置的下一个字符并未被移除。比如输入_random,处理后word[0]变成R(word[1]的大写),而word[1]仍保留原有的r,后续又强制首字母小写,最终变成rrandom。 - 开头特殊字符未实际移除:注释标注要移除开头的
_、数字等,但代码逻辑完全没实现这一步,开头的下划线会被错误地转换为下一个字符的大写,而非直接跳过。 - 特殊字符清理时机错误:先处理驼峰再清理非字母字符,会导致已处理的字符被打乱,且清理逻辑未和驼峰转换同步,流程混乱。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void camelCase(char* word) { int i = 0, j = 0; // 跳过开头的所有非字母字符 while (word[i] != '\0' && !isalpha(word[i])) { i++; } // 如果字符串为空,直接返回 if (word[i] == '\0') { word[j] = '\0'; return; } // 首字母转小写,符合小驼峰规则 word[j++] = tolower(word[i++]); while (word[i] != '\0') { // 跳过连续的非字母字符(包括下划线、数字、特殊符号) while (word[i] != '\0' && !isalpha(word[i])) { i++; } if (word[i] == '\0') { break; } // 非字母后的首字母转大写 word[j++] = toupper(word[i++]); // 后续字母统一转小写 while (word[i] != '\0' && isalpha(word[i])) { word[j++] = tolower(word[i++]); } } // 标记字符串结束 word[j] = '\0'; } int main() { char *wordArray = (char*)malloc(sizeof(char)*100); if (wordArray == NULL) { printf("Memory allocation failed\n"); return 1; } printf("Enter word: "); // 使用fgets避免scanf截断空格(若不需要支持空格可改回scanf("%s", wordArray)) fgets(wordArray, 100, stdin); // 移除fgets读取的换行符 char *newline = strchr(wordArray, '\n'); if (newline != NULL) { *newline = '\0'; } camelCase(wordArray); printf("%s\n", wordArray); free(wordArray); return 0; }
修正逻辑说明
- 双指针高效处理:用读指针
i遍历原字符串,写指针j构建目标字符串,避免字符重复和内存覆盖问题。 - 开头无效字符清理:先跳过所有开头的非字母字符,确保首字母为有效字母。
- 驼峰转换同步完成:
- 首字母强制转小写,严格符合小驼峰命名规则。
- 遇到非字母字符时,跳过所有连续无效字符,将下一个有效字母转大写,后续字母统一转小写。
- 内存安全优化:添加malloc失败判断,使用
fgets支持含空格输入,最后主动释放内存避免泄漏。
测试输入_random__word_provided,会输出预期的randomWordProvided。
内容的提问来源于stack exchange,提问作者Shy9566
相关产品推荐
相关产品推荐

