C语言字符串转小写函数编写求助:代码无法正常运行
问题排查与修正
直接说代码里的几个致命问题:
- 未调用目标函数:main里定义了
inlower数组,但完全没调用你写的lowercase函数,转换逻辑根本没执行。 - 函数原型与定义不匹配:原型声明的是
string lowercase(char inlower[]);,但实际定义的参数是string word,参数名、类型都对不上,编译器会报错。 - 未定义变量使用:
lowercase函数里直接用inlower,但这个变量既不是函数参数,也没在函数内声明,属于未定义标识符,编译失败。 - 非法返回语句:
return inlower[];是语法错误,C语言里不能这么写数组返回;就算改成return inlower,如果inlower是局部数组,函数返回后内存会被释放,返回的指针会变成野指针,访问会导致未定义行为。 - 字符串缺少终止符:C字符串必须以
'\0'结尾,你转换后没添加这个字符,就算转换成功,输出时也会乱码。 - 数组长度不足:
main里char inlower[strlen(word)];的长度没算上终止符,应该是strlen(word)+1,否则存不下'\0'。
修正后的代码
#include <ctype.h> #include <cs50.h> #include <stdio.h> #include <string.h> #include <stdlib.h> // 新增malloc所需头文件 // 修正函数原型:参数是输入字符串,返回转换后的字符串 string lowercase(string word); int main(void) { string word = get_string("Type in a word: "); // 调用lowercase函数获取转换后的字符串 string lower_word = lowercase(word); printf("You typed: %s\n", word); if (lower_word != NULL) { printf("Lowercase version: %s\n", lower_word); free(lower_word); // 手动释放动态分配的内存 } } string lowercase(string word) { int len = strlen(word); // 动态分配内存,长度是len+1,留位置放终止符 string inlower = malloc(len + 1); if (inlower == NULL) { // 内存分配失败返回NULL return NULL; } for (int i = 0; i < len; i++) { // 转成unsigned char避免tolower处理特殊字符的未定义行为,再转char赋值 inlower[i] = (char)tolower((unsigned char)word[i]); } // 添加字符串终止符,保证是合法C字符串 inlower[len] = '\0'; return inlower; }
关键修改说明
- 函数原型与定义统一:把原型改成
string lowercase(string word);,和定义匹配,明确输入是要转换的字符串。 - 动态分配内存:用
malloc在堆上分配内存,避免局部数组返回后被销毁的问题,使用完记得用free释放。 - 添加终止符:循环结束后手动赋值
'\0',确保转换后的内容是合法的C字符串。 - 正确调用函数:在main里调用
lowercase并接收返回值,输出转换结果。 - tolower的安全使用:将输入字符转成
unsigned char后传入tolower,避免处理ASCII值大于127的字符时出现未定义行为。
内容的提问来源于stack exchange,提问作者Dimitri Mikhalev
相关产品推荐
相关产品推荐

