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

C语言使用标准库将字符串转大写的方法及自定义ASCII转换报错解决

问题修复方案

现有代码错误点

  • 函数参数类型错误:string_upper的入参str定义为char类型(单个字符),无法接收字符串(字符数组/字符指针),也不能用下标[]访问,这是触发索引错误的核心原因,需改为char* str或char str[]。
  • 存储转换结果的str2定义为char类型,同样是单个字符,无法作为数组存储多字符结果,可选择直接在原字符串上修改,或额外传入输出缓冲区参数。
  • 转换逻辑写法错误:str[i - 32]是取下标为i-32的字符,逻辑完全错误,正确写法是取str[i]这个字符的数值减去32,即str[i] - 32。
  • 手动减32的写法不严谨:仅对ASCII编码的小写字母生效,遇到非小写字母的字符会转换错误,建议直接用标准库ctype.h提供的toupper()函数,自动过滤非小写字母的字符,兼容性更好。

修复后的可运行代码

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

#define STRLEN 200

// 原地转大写,直接修改传入的字符串
void string_upper(char* str) {
    int length = strlen(str);
    for (int i = 0; i < length; i++) {
        // 标准库toupper自动处理小写字母,其他字符保持不变
        str[i] = toupper(str[i]);
        // 若要手动实现ASCII转大写逻辑,可替换为以下代码:
        // if (str[i] >= 'a' && str[i] <= 'z') str[i] -= 32;
    }
}

int main() {
    char word[STRLEN] = { 0 };
    printf("Write a word: ");
    fgets(word, STRLEN, stdin);
    // 去除fgets读取到的末尾换行符
    word[strcspn(word, "\n")] = '\0';

    string_upper(word);
    printf("转换结果:%s\n", word);
    return 0;
}

实现说明

  • 采用原地修改的方案,不需要额外定义存储结果的变量,直接修改传入的字符串数组即可。
  • 标准库toupper()属于C标准库接口,符合你用标准库实现转换的需求,会自动判断字符是否为小写字母,仅对符合条件的字符做转换,数字、符号、大写字母都会保持原样,比手动减32的逻辑更安全。
  • 额外添加了去除fgets读取的末尾换行符的逻辑,避免输出结果多余空行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:15:01