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

在C语言中如何对char*使用toupper函数?我的代码未生成预期结果

问题分析与解决

你的代码存在三个核心问题,导致无法得到预期结果:

  1. 未保存转换结果:toupper函数仅返回转换后的大写字符,但你没有将结果赋值回原字符位置,原字符串根本没被修改。
  2. 指针偏移至字符串末尾:循环结束后shi已经移动到字符串的终止符'\0'位置,此时用它打印自然输出空内容。
  3. 潜在的只读内存修改风险:如果command->args[0]指向的是字符串常量(比如字面量),直接修改它会触发未定义行为,因为常量内存区域是只读的。

修复后的代码

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

int main() {
    const char* original = command->args[0]; // 原字符串值为"binance"
    // 分配可修改的内存存储原字符串
    char* shi = malloc(strlen(original) + 1);
    if (!shi) {
        perror("malloc failed");
        return 1;
    }
    strcpy(shi, original);

    char* temp = shi; // 用临时指针遍历,保留原指针起始位置
    while(*temp) {
        *temp = toupper((unsigned char)*temp); // 将转换结果存回原位置
        temp++;
    }

    printf("Capitalized version is: %s\n", shi);
    free(shi); // 释放分配的内存
    return 0;
}

关键修改说明

  • 用malloc分配可修改的内存,避免直接修改只读字符串常量的风险。
  • 使用临时指针temp遍历字符串,保留shi指向起始位置,确保最后能正确打印完整内容。
  • 将toupper的返回值赋值给*temp,真正修改字符串内容。
  • 增加内存分配失败的检查,并用free释放内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:20:28