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

C语言中如何将字符转大写后追加到字符串并返回(不使用printf/putchar)

问题分析与解决方案

你的代码存在几个关键问题导致无法正常工作:

  • char *result = ""; 指向的是只读字符串常量,无法通过strncat修改,会触发未定义行为。
  • char *str; 未初始化就直接解引用,属于非法内存访问。
  • &toupper -32 语法错误,计算逻辑混乱,正确的写法应该是先得到转换后的字符,再取其地址。
  • 没有为结果字符串分配足够的内存空间。

以下是修正后的实现,满足「转换为大写、返回完整字符串、不使用printf/putchar」的要求:

#include <string.h>
#include <ctype.h>  // 使用标准toupper函数,兼容性更强

char *my_upcase(char *param_1)
{
    // 获取输入字符串长度,分配内存(+1用于存储字符串终止符'\0')
    size_t len = strlen(param_1);
    char *result = (char *)malloc(len + 1);
    if (result == NULL) {
        return NULL;  // 内存分配失败时返回空指针
    }

    size_t j = 0;
    while (j < len) {
        // 用toupper转换大写,也可以手动判断:param_1[j] >= 'a' && param_1[j] <= 'z' ? param_1[j]-32 : param_1[j]
        result[j] = toupper((unsigned char)param_1[j]);
        j++;
    }
    result[len] = '\0';  // 必须添加字符串终止符,否则会导致未定义行为

    return result;
}

关键说明:

  1. 内存分配:通过malloc分配与输入字符串长度+1的内存,确保能容纳所有字符和终止符。调用者使用完返回的字符串后,需要调用free释放内存,避免内存泄漏。
  2. 字符转换:使用标准库ctype.h中的toupper函数,比手动减32更健壮(能适配不同字符编码场景)。如果不想依赖标准函数,可替换为手动判断逻辑:
    result[j] = (param_1[j] >= 'a' && param_1[j] <= 'z') ? (param_1[j] - 32) : param_1[j];
    
  3. 终止符处理:C语言字符串必须以'\0'结尾,否则后续调用字符串处理函数(如strlen、strcpy)会出现异常。

如果允许直接修改原字符串(无需返回新字符串),可以简化实现:

char *my_upcase(char *param_1)
{
    char *ptr = param_1;
    while (*ptr != '\0') {
        *ptr = toupper((unsigned char)*ptr);
        ptr++;
    }
    return param_1;
}

这种方式无需分配内存,但会修改输入的原字符串,适合允许修改原数据的场景。

内容的提问来源于stack exchange,提问作者Femi-Laizer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:05:20