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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:57:50