C语言二进制转十进制程序未正常终止问题求助
解决二进制转十进制程序输入非法值后未正常终止的问题
我来帮你拆解下问题根源:当输入0/1以外的非法值时,程序只是跳出了输入循环,但后续的十进制转换逻辑还会继续执行。这时候队列里可能只有部分合法数据甚至是空的,调用delq()会触发"QUEUE EMPTY"提示,而且delq()在队列空时返回的是垃圾值,最终计算出的十进制结果自然也是错的。
下面给你两种可行的修改方案,彻底解决这个问题:
方案1:检测到非法输入后直接终止程序
这种方式最直接,用exit()函数立刻结束程序,记得要引入<stdlib.h>头文件:
#include<stdio.h> #include<stdlib.h> // 新增头文件,用于exit函数 #include<math.h> // 补充pow函数依赖的头文件(之前没加会有编译警告) int q[6],f,r; // 给函数显式声明返回值类型,符合C语言标准 void addq(int ele) { if(r==5) printf("QUEUE FULL"); else { r++; q[r]=ele; if(f==-1) f=0; } } int delq() { int ele; if(f==-1) { printf("QUEUE EMPTY"); // 队列空时直接终止,避免返回垃圾值 exit(EXIT_FAILURE); } else { ele=q[f]; if(f==r) f=r=-1; else f++; return ele; } } int main() { int a,v,i,m,sum=0; f=r=-1; for(i=0;i<=5;i++) { scanf("%d",&v); if (v==1 || v==0){ addq(v); } else{ printf("wrong input\n"); // 加换行让输出更清晰 exit(EXIT_FAILURE); // 直接终止程序,不再执行后续逻辑 } } for(i=5;i>=0;i--) { a=delq(); m=pow(2,i); sum=sum+a*m; } printf("DECIMAL NO.IS:%d\n",sum); return 0; }
方案2:用标志位跳过后续转换逻辑
如果你希望程序提示错误后优雅结束,而非直接终止,可以设置一个有效性标志:
#include<stdio.h> #include<math.h> int q[6],f,r; void addq(int ele) { if(r==5) printf("QUEUE FULL"); else { r++; q[r]=ele; if(f==-1) f=0; } } int delq() { int ele; if(f==-1) { printf("QUEUE EMPTY"); return 0; // 返回0避免垃圾值,正常流程下不会触发这个分支 } else { ele=q[f]; if(f==r) f=r=-1; else f++; return ele; } } int main() { int a,v,i,m,sum=0; int input_valid = 1; // 新增标志位,标记输入是否合法 f=r=-1; for(i=0;i<=5;i++) { scanf("%d",&v); if (v==1 || v==0){ addq(v); } else{ printf("wrong input\n"); input_valid = 0; // 标记输入非法 break; } } // 只有输入合法时,才执行转换和输出 if(input_valid) { for(i=5;i>=0;i--) { a=delq(); m=pow(2,i); sum=sum+a*m; } printf("DECIMAL NO.IS:%d\n",sum); } return 0; }
另外补充两个小细节:
- 代码中使用了
pow()函数,但之前没有包含<math.h>头文件,编译时会出现警告,建议加上; - 函数
addq和delq最好显式声明返回值类型,避免C语言隐式声明带来的潜在问题。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

