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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:50:27