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

C语言中将const char *转为小写char *时输出乱码如何解决?

问题成因

核心错误是内存分配逻辑出错,其余属于潜在风险点:

  • 内存分配大小错误:word是const char*类型的指针,sizeof(word)计算的是指针本身的内存大小(32位系统为4字节,64位系统为8字节),和传入字符串的实际长度完全无关。如果输入单词长度超过指针大小,后续给lower数组赋值时会发生内存越界,属于未定义行为,输出乱码是这类问题的典型表现。
  • 潜在问题1:缺少必要头文件,该函数依赖<string.h>提供strlen、<stdlib.h>提供malloc、<ctype.h>提供tolower,未引入头文件可能导致编译器隐式声明函数,触发异常行为。
  • 潜在问题2:tolower参数未做类型转换,如果系统中char为有符号类型,当字符取值大于127时直接传入tolower会触发未定义行为。
  • 潜在问题3:未检查malloc返回值,内存分配失败时会直接操作空指针,导致程序崩溃。
修复方案

修正后的代码如下:

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

char *lowercase(const char *word) {
    int length = strlen(word);
    // 按字符串实际长度申请内存,+1是预留结束符'\0'的空间
    char *lower = malloc(length + 1);
    // 内存分配失败时返回空指针,避免空访问
    if (lower == NULL) {
        return NULL;
    }
    for(int i=0; i < length; i++) {
        // 转成unsigned char规避有符号字符的异常问题
        lower[i] = tolower((unsigned char)word[i]);
    }
    lower[length] = '\0';
    return lower;
}

注意:调用该函数获取到返回的字符串后,使用完毕需要手动调用free释放内存,避免出现内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:45:01