C语言中如何将字符转大写后追加到字符串并返回(不使用printf/putchar)
问题分析与解决方案
你的代码存在几个关键问题导致无法正常工作:
char *result = "";指向的是只读字符串常量,无法通过strncat修改,会触发未定义行为。char *str;未初始化就直接解引用,属于非法内存访问。&toupper -32语法错误,计算逻辑混乱,正确的写法应该是先得到转换后的字符,再取其地址。- 没有为结果字符串分配足够的内存空间。
以下是修正后的实现,满足「转换为大写、返回完整字符串、不使用printf/putchar」的要求:
#include <string.h> #include <ctype.h> // 使用标准toupper函数,兼容性更强 char *my_upcase(char *param_1) { // 获取输入字符串长度,分配内存(+1用于存储字符串终止符'\0') size_t len = strlen(param_1); char *result = (char *)malloc(len + 1); if (result == NULL) { return NULL; // 内存分配失败时返回空指针 } size_t j = 0; while (j < len) { // 用toupper转换大写,也可以手动判断:param_1[j] >= 'a' && param_1[j] <= 'z' ? param_1[j]-32 : param_1[j] result[j] = toupper((unsigned char)param_1[j]); j++; } result[len] = '\0'; // 必须添加字符串终止符,否则会导致未定义行为 return result; }
关键说明:
- 内存分配:通过
malloc分配与输入字符串长度+1的内存,确保能容纳所有字符和终止符。调用者使用完返回的字符串后,需要调用free释放内存,避免内存泄漏。 - 字符转换:使用标准库
ctype.h中的toupper函数,比手动减32更健壮(能适配不同字符编码场景)。如果不想依赖标准函数,可替换为手动判断逻辑:result[j] = (param_1[j] >= 'a' && param_1[j] <= 'z') ? (param_1[j] - 32) : param_1[j]; - 终止符处理:C语言字符串必须以
'\0'结尾,否则后续调用字符串处理函数(如strlen、strcpy)会出现异常。
如果允许直接修改原字符串(无需返回新字符串),可以简化实现:
char *my_upcase(char *param_1) { char *ptr = param_1; while (*ptr != '\0') { *ptr = toupper((unsigned char)*ptr); ptr++; } return param_1; }
这种方式无需分配内存,但会修改输入的原字符串,适合允许修改原数据的场景。
内容的提问来源于stack exchange,提问作者Femi-Laizer
相关产品推荐
相关产品推荐

