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

C语言通过ASCII加32实现大写转小写为何出现多余乱码字符

问题原因
  • 转换后的结果数组final_res未添加C语言字符串必需的结束标识符'\0'。C标准中printf的%s格式符会从传入的首地址开始输出字符,直到遇到内存中随机出现的'\0'才会终止,你代码里仅遍历了输入字符串的有效字符,没有将结束符写入final_res,输出时读取到数组外的随机内存数据就会出现乱码。
  • 补充潜在问题:scanf("%s", &user_inp)写法错误,数组名本身已经是指向数组首地址的指针,不需要额外加取地址符&;同时未限制输入长度,输入超过15个字符时会出现缓冲区溢出,触发未定义行为。
修复方法

核心修改点如下:

  1. 遍历输入字符串结束后,手动给final_res的对应位置赋值'\0'补全字符串结束符
  2. 修正scanf的参数写法,移除多余的取地址符
  3. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 01:06:08