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

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;
}

修正逻辑说明

  1. 双指针高效处理:用读指针i遍历原字符串,写指针j构建目标字符串,避免字符重复和内存覆盖问题。
  2. 开头无效字符清理:先跳过所有开头的非字母字符,确保首字母为有效字母。
  3. 驼峰转换同步完成:
    • 首字母强制转小写,严格符合小驼峰命名规则。
    • 遇到非字母字符时,跳过所有连续无效字符,将下一个有效字母转大写,后续字母统一转小写。
  4. 内存安全优化:添加malloc失败判断,使用fgets支持含空格输入,最后主动释放内存避免泄漏。

测试输入_random__word_provided,会输出预期的randomWordProvided。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:45:36