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

C语言位填充代码异常:字符串执行中出现末尾垃圾值求助

解决位填充代码中的垃圾值与字符串对比失效问题

问题根源分析

  • 数组越界与字符串未终止:原代码中char ch[5]仅能存储5个字符,但C语言字符串需要末尾的'\0'作为结束标志,缺失该标志会导致printf("%s")、strcmp等函数读取内存中后续的垃圾值。同时input函数的循环i<=n(n=5)会写入ch[5],超出数组边界,破坏内存布局。
  • 输入读取错误:使用scanf("%c")循环读取时,会将输入后的换行符也读入数组,导致混入非0/1字符,进一步加剧越界问题。

修复后的完整代码

#include<stdio.h>
#include<string.h>
void input(char[],int);
void stuff(char ch[],int n)
{
    char str1[6]="11111";
    char str2[6]="00000";
    printf("str1=%s\n",str1);
    printf("ch=%s\n",ch);
    if(!strcmp(ch,str1))
    {
        printf("\n111101");
    }
    else if(!strcmp(ch,str2))
    {
        printf("\n000010");
    }
    else
    {
        puts(ch);
    }
}
int main()
{
    int flag=0;
    char ch[6]; // 预留空间存储字符串终止符'\0'
    input(ch,5);
    printf("ch0=%s\n",ch);
    for(int i=0;i<5;i++)
    {
        if((ch[i]!='0')&&(ch[i]!='1'))
        {
            flag=1;
            break; // 找到无效字符后立即退出循环,优化效率
        }
    }

    if(flag==0)
    {
        puts("Entered data:");
        for(int i=0;i<5;i++)
        {
            printf("%c",ch[i]);
        }
        puts("\nAfter stuffing");
        printf("ch1=%s\n",ch);
        stuff(ch,5);
    }
    else
    {
        printf("Enter a valid data\n");
        printf("%d",flag);
    }
    return 0; // 符合C语言标准的main函数返回值
}
void input(char ch[],int n)
{
    printf("Enter 5 digits\n");
    scanf("%5s", ch); // 自动读取5个非空白字符并添加'\0',避免越界和换行符问题
}

关键修改点说明

  1. 数组大小调整:将char ch[5]改为char ch[6],预留一个字节存储字符串终止符'\0',确保字符串操作函数能正确识别结束位置。
  2. 输入逻辑优化:用scanf("%5s", ch)替代手动循环读取%c,自动处理字符串终止,同时跳过输入中的空白字符,避免读取换行符导致的无效数据。
  3. 代码标准化:将void main()改为符合C标准的int main()并返回0,提升代码兼容性。
  4. 无效检查优化:在检测到非0/1字符时立即跳出循环,减少不必要的遍历。

测试验证

输入11111后,程序会正确识别全1序列,输出填充后的111101,不再出现垃圾值,字符串对比逻辑正常工作。

内容的提问来源于stack exchange,提问作者Pranav Vasishta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:00:55