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

Linux Mint下GCC编译时toupper()函数无法正常工作的问题

解决toupper()不生效的问题

嘿,我看你碰到toupper()函数没起作用的问题了,这其实是个很容易踩的小坑!

问题根源

toupper()函数不会直接修改你传入的原字符,它的设计是返回转换后的大写字符。你现在的代码只是调用了函数,但完全没把返回的结果存回原数组里,所以inputText[i]自然还是原来的样子。

另外还有个细节要注意:如果你的字符是有符号类型(比如char在很多系统上是有符号的),当字符值为负数时(比如某些扩展ASCII字符),toupper()的行为是未定义的,所以最好先把字符转成unsigned char再传入。

修改后的代码片段

把你那行无效的toupper()调用改成这样:

// 别忘了先包含 <ctype.h> 头文件!
#include <ctype.h>

// ... 你的其他代码 ...

do { 
    scanf(" %[^\n]" , inputText ); // 这里的格式串多了个s,应该去掉,%[^\n]已经是匹配非换行符的所有字符了
    printf("Input text supplied is: %s\n", inputText); 
    int input_text_size = strlen(inputText); // 这里不需要减1,strlen返回的是有效字符数,循环用i < input_text_size更稳妥
    for(int i = 0; i < input_text_size; i++) { 
        inputText[i] = toupper((unsigned char)inputText[i]); // 关键:把返回值赋值回去
        printf("toupper val = %c\n", inputText[i]);
        // ... 你的其他测试代码 ...
    }
} while(...); // 你代码里的循环条件没写完,记得补上

额外提醒

  • 一定要包含<ctype.h>头文件,否则toupper()可能会因为隐式声明导致行为异常;
  • 你原来的scanf格式串" %[^\n]s"里多了个s,%[^\n]已经是完整的格式说明符了,多余的s会导致输入匹配失败;
  • strlen(inputText) - 1的写法有风险,如果输入是空字符串,strlen返回0,减1后会变成负数,循环会出问题,直接用strlen(inputText)作为循环上限,循环条件写成i < input_text_size更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:45:32