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

为何我的C语言删除字符串元音代码在特定输入下报错?

解决C语言删除元音后输出乱码的问题

你的代码出现乱码的核心原因是目标字符串c1没有添加字符串结束符'\0'。printf用%s格式输出字符串时,会持续读取内存直到遇到'\0',如果没手动添加,就会把内存里的随机垃圾字符(比如你看到的@)一并输出。短字符串偶尔正常只是巧合——刚好c1后面的内存里有'\0',长字符串覆盖了这块区域就会暴露问题。

修复步骤:

  1. 添加字符串结束符
    在循环结束后,给c1末尾补上'\0',放在printf之前:

    c1[j] = '\0';
    
  2. 替换不安全的gets函数
    gets函数已被C标准废弃,它会读取超出缓冲区长度的输入导致溢出,建议用fgets替代。注意fgets会把输入的换行符也读进去,需要额外处理:

    fgets(c, sizeof(c), stdin);
    // 去掉fgets读取的换行符
    c[strcspn(c, "\n")] = '\0';
    

    这一步需要包含string.h头文件,所以要在代码开头加上#include <string.h>。

  3. 可选:支持大写元音
    原代码只处理小写元音,若需要过滤大写的A/E/I/O/U,把判断条件扩充为:

    if(c[i]=='a' || c[i]=='e' || c[i]=='i' || c[i]=='o' || c[i]=='u' ||
       c[i]=='A' || c[i]=='E' || c[i]=='I' || c[i]=='O' || c[i]=='U');
    

修复后的完整代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char c[200], c1[200];
    int i, j;
    printf("enter the string: ");
    fgets(c, sizeof(c), stdin);
    // 去除输入末尾的换行符
    c[strcspn(c, "\n")] = '\0';
    
    for(i=0, j=0; c[i]!='\0'; i++)
    {
        if(c[i]=='a' || c[i]=='e' || c[i]=='i' || c[i]=='o' || c[i]=='u' ||
           c[i]=='A' || c[i]=='E' || c[i]=='I' || c[i]=='O' || c[i]=='U');
        else
        {
            c1[j++] = c[i];
        }
    }
    c1[j] = '\0'; // 标记字符串结束
    printf("string after removal of vowels: %s", c1);
    return 0;
}

内容的提问来源于stack exchange,提问作者Srijan Gods

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:45:17