如何在给定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
相关产品推荐
相关产品推荐

