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

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

关键修改说明

  1. 函数原型与定义统一:把原型改成string lowercase(string word);,和定义匹配,明确输入是要转换的字符串。
  2. 动态分配内存:用malloc在堆上分配内存,避免局部数组返回后被销毁的问题,使用完记得用free释放。
  3. 添加终止符:循环结束后手动赋值'\0',确保转换后的内容是合法的C字符串。
  4. 正确调用函数:在main里调用lowercase并接收返回值,输出转换结果。
  5. tolower的安全使用:将输入字符转成unsigned char后传入tolower,避免处理ASCII值大于127的字符时出现未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:15:39