C语言通过ASCII加32实现大写转小写为何出现多余乱码字符
问题原因
- 转换后的结果数组
final_res未添加C语言字符串必需的结束标识符'\0'。C标准中printf的%s格式符会从传入的首地址开始输出字符,直到遇到内存中随机出现的'\0'才会终止,你代码里仅遍历了输入字符串的有效字符,没有将结束符写入final_res,输出时读取到数组外的随机内存数据就会出现乱码。 - 补充潜在问题:
scanf("%s", &user_inp)写法错误,数组名本身已经是指向数组首地址的指针,不需要额外加取地址符&;同时未限制输入长度,输入超过15个字符时会出现缓冲区溢出,触发未定义行为。
修复方法
核心修改点如下:
- 遍历输入字符串结束后,手动给
final_res的对应位置赋值'\0'补全字符串结束符 - 修正
scanf的参数写法,移除多余的取地址符 - 给
scanf的格式符增加长度限制,避免缓冲区溢出
修复后的完整代码:
#include <stdio.h> int main() { char user_inp[16]; char final_res[16]; int ascii; printf("%s", "Enter any string : "); // 限制最多输入15个字符,避免缓冲区溢出,修正地址参数 scanf("%15s", user_inp); int i; for (i = 0; user_inp[i] != '\0'; i++){ ascii = (int)user_inp[i]; if (ascii >= 65 && ascii <= 90){ ascii += 32; } final_res[i] = ascii; } // 补充字符串结束符 final_res[i] = '\0'; printf("%s\n", final_res); return 0; }
内容的提问来源于stack exchange,提问作者Apurba Adhikari
相关产品推荐
相关产品推荐

