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

C语言实现字符串转小写且不修改原字符串的方法

避免strLower函数修改原输入字符串的方法

你的函数直接操作传入指针指向的原字符串内存,因此会修改外部的原数据。要解决这个问题,核心是创建原字符串的独立副本,在副本上完成小写转换,具体实现步骤如下:

  • 先计算原字符串的长度,为新字符串分配足够内存(需预留字符串结束符\0的位置)
  • 将原字符串内容完整复制到新内存空间中
  • 在新字符串副本上执行小写转换逻辑
  • 返回新字符串的指针(注意调用者需要手动释放该内存,避免内存泄漏)

修改后的代码示例:

#include <ctype.h>
#include <string.h>
#include <stdlib.h>

char* strLower(const char* s) {
    // 处理空指针输入,避免后续操作崩溃
    if (s == NULL) {
        return NULL;
    }

    // 计算字符串总长度,+1 用于存储结束符'\0'
    size_t len = strlen(s) + 1;
    // 分配内存,检查分配是否成功
    char* new_str = (char*)malloc(len);
    if (new_str == NULL) {
        return NULL;
    }

    // 复制原字符串到新内存
    strcpy(new_str, s);

    // 对新字符串执行小写转换
    for (char* p = new_str; *p; p++) {
        // 转成unsigned char,避免tolower处理有符号char的负数导致未定义行为
        *p = tolower((unsigned char)*p);
    }

    return new_str;
}

关键细节说明

  • 将函数参数改为const char* s,明确告知调用者原输入字符串不会被修改,同时兼容传入字符串常量的场景
  • 调用该函数后,必须使用free()释放返回的指针,示例:
    char* original = "Hello WORLD";
    char* lower_str = strLower(original);
    if (lower_str != NULL) {
        printf("%s\n", lower_str);
        free(lower_str); // 必须释放内存,避免泄漏
    }
    
  • 原代码中的lower()应为标准库函数tolower(),需要包含<ctype.h>头文件;传入unsigned char是因为若char为有符号类型,部分扩展ASCII字符的数值会是负数,tolower()处理负数会触发未定义行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:42:34