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',避免越界和换行符问题 }
关键修改点说明
- 数组大小调整:将
char ch[5]改为char ch[6],预留一个字节存储字符串终止符'\0',确保字符串操作函数能正确识别结束位置。 - 输入逻辑优化:用
scanf("%5s", ch)替代手动循环读取%c,自动处理字符串终止,同时跳过输入中的空白字符,避免读取换行符导致的无效数据。 - 代码标准化:将
void main()改为符合C标准的int main()并返回0,提升代码兼容性。 - 无效检查优化:在检测到非0/1字符时立即跳出循环,减少不必要的遍历。
测试验证
输入11111后,程序会正确识别全1序列,输出填充后的111101,不再出现垃圾值,字符串对比逻辑正常工作。
内容的提问来源于stack exchange,提问作者Pranav Vasishta
相关产品推荐
相关产品推荐

