C语言首字母缩写程序输出随机字符,如何修复?
修复首字母缩写程序的随机字符问题
你的代码存在几个核心问题,直接导致输出出现随机字符,以下是具体修复方案:
问题根源
acronym数组未初始化:strcat要求目标字符串必须以\0(字符串结束符)开头,未初始化的acronym内存中是随机值,strcat会从这些随机值里寻找结束符,最终拼接出大量乱码。- 错误的缓冲区定义:
char buffer[][20] = {strings[i][j]};是完全错误的二维数组初始化方式,且buffer[i]会访问超出数组范围的内存,进一步加剧乱码问题。 - 固定循环次数不合理:内层循环硬编码循环11次,既可能没处理完完整字符串,也可能访问超出字符串长度的内存区域。
fgets读取的换行符未处理:虽不直接导致乱码,但会让存储的字符串末尾带换行,影响后续处理的整洁性。
修复步骤
- 每次处理新短语前,将
acronym[i]初始化为空字符串(即把第一个字符设为\0)。 - 替换错误的缓冲区逻辑:直接将大写字母追加到
acronym[i],用索引跟踪缩写的当前长度即可,无需复杂的二维数组。 - 内层循环改为遍历到字符串末尾(以
\0为结束标志),而非固定次数。 - 处理
fgets读取的换行符:若字符串末尾是\n,将其替换为\0。
修复后的完整代码
#include <stdio.h> #include <string.h> #define MAXLEN 50 int main() { int num; printf("Enter number of acronyms to add to the database:"); scanf("%d", &num); getchar(); // 清除scanf留下的换行符 char strings[num][MAXLEN]; char acronym[num][MAXLEN]; for(int i = 0; i < num; i++){ printf("Enter the string to convert into an acronym:"); fgets(strings[i], MAXLEN, stdin); // 移除fgets读取的换行符 size_t len = strlen(strings[i]); if(len > 0 && strings[i][len-1] == '\n'){ strings[i][len-1] = '\0'; } printf("%s\n", strings[i]); // 初始化当前缩写为空字符串 acronym[i][0] = '\0'; int acro_idx = 0; // 跟踪缩写的当前长度 for(int j = 0; strings[i][j] != '\0'; j++){ if(strings[i][j] >= 'A' && strings[i][j] <= 'Z'){ // 确保缩写不会超出缓冲区上限 if(acro_idx < MAXLEN - 1){ acronym[i][acro_idx] = strings[i][j]; acro_idx++; acronym[i][acro_idx] = '\0'; // 每次追加后更新结束符 } } } puts(acronym[i]); } return 0; }
额外优化建议
- 支持小写字母转大写后加入缩写:包含
<ctype.h>头文件,判断小写字母后用toupper()转换。 - 提取空格分隔单词的首字母:添加逻辑判断空格后的第一个字符,将其转为大写后加入缩写(比如"Hello World"生成"HW")。
内容的提问来源于stack exchange,提问作者Snex
相关产品推荐
相关产品推荐

