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

如何在给定C代码中使用toupper()函数实现输入转大写?

如何在C语言的read/write循环中使用toupper()转换为大写?

嗨,我来帮你搞定这个问题!你现在的代码只是把输入原样输出到 stdout,要用上 toupper() 把所有字符转换成大写,其实只需要在读取到缓冲区之后、写入之前,遍历每个字符做转换就行啦。

需要注意的细节

你已经正确包含了 <ctype.h> 头文件,所以 toupper() 是可以直接调用的,但要注意:toupper() 的参数要求是 unsigned char 类型(或者可以转换为非负的 int)。如果你的系统中 char 是有符号类型,当遇到 ASCII 值大于 127 的字符时,直接传 char 会导致符号扩展成负数,这会让 toupper() 的行为变成未定义,所以转换时最好先把 char 强制转换成 unsigned char。

修改后的完整代码

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>

int main(){
    char buffer[50];
    int retorno, leido, i; // 新增i作为循环计数器
    while( (leido = read(0, buffer, sizeof(buffer))) > 0){
        // 遍历缓冲区的每个字符,转换为大写
        for(i = 0; i < leido; i++){
            buffer[i] = toupper( (unsigned char)buffer[i] );
        }
        retorno = write(1, buffer, leido);
        // 即时检查write的错误,避免后续逻辑出错
        if(retorno < 0){
            perror("write error");
            return -1;
        }
    }
    // 处理read的错误情况
    if(leido < 0){
        perror("read error");
        return -1;
    }
    printf ("valor de retorno: %d\n", retorno);
    return 0;
}

关键改动说明

  • 新增了循环计数器 i,用来遍历缓冲区里的每个字符
  • 在 read() 成功读取内容后,增加了一个 for 循环,逐个调用 toupper() 转换字符,同时做了 unsigned char 的强制转换
  • 额外增加了对 read() 和 write() 错误的检查逻辑,让代码更健壮

这样修改之后,你的程序就能把所有输入的字符转换成大写后输出啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:28:03