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
相关产品推荐
相关产品推荐

