在C语言中如何对char*使用toupper函数?我的代码未生成预期结果
问题分析与解决
你的代码存在三个核心问题,导致无法得到预期结果:
- 未保存转换结果:
toupper函数仅返回转换后的大写字符,但你没有将结果赋值回原字符位置,原字符串根本没被修改。 - 指针偏移至字符串末尾:循环结束后
shi已经移动到字符串的终止符'\0'位置,此时用它打印自然输出空内容。 - 潜在的只读内存修改风险:如果
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
相关产品推荐
相关产品推荐

