首页 > 解决方案 > C++ 程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出正确的值

问题描述

该程序在第一次尝试中给出垃圾值,即如果它没有捕获任何异常,但是当发现异常并重试时,程序会给出正确和正确的输出。如何更正它第一次获得的输入的输出(即第一次输入无一例外......)。该程序是将二进制转换为十进制。

#include <iostream>
#include <math.h>
using namespace std;

int check() {
    long int bin;
    cout<<"Enter the binary number : ";
    cin>>bin;
    long int temp=bin;int len,t,sum=0;
    while(temp!=0) {
        temp=temp/10;
        len++;
    }
    temp=bin;
    for(int i=0;i<len;i++) {
        if(temp%10==0 || temp%10==1)
            temp=temp/10;
        else
            throw(0);
    }
    temp=bin;
    for(int i=0;i<len;i++) {
        t=temp%10;
        sum+=t*pow(2,i);
        temp=temp/10;
    }
    cout<<"The decimal equivalent is "<<sum<<"."<<endl;
}

int main()
{
    string a[10];int cont;
    a[0]="<--Invalid Input. Please enter proper binary number(0s & 1s).-- 
    >\n";
    try {
        check();
    }
    catch(int e_c) {
        cout<<a[e_c];
        cout<<"To try again press 1 else 0."<<endl;
        cin>>cont;
        if(cont==1) {
            try {
                check();
            }
            catch(int e_c) {
                cout<<"Wrong input!!!\n\nX_Terminating Program._X\n";
            }
        }
    }
    return 0;
}

输出带有垃圾值和正确输入的第一个 异常被捕获并且重试输出是正确的

标签: c++c++11

解决方案


您的程序中有 2 个主要错误。当你编译你的程序时,你应该确保打开错误和警告,它会在你第一次运行之前指出这些问题。

当我编译你的程序时,我从编译器得到以下结果:

main.cpp:35:1:错误:控制可能到达非空函数的结尾 [-Werror,-Wreturn-type]

}
^

main.cpp:19:9: 警告:变量 'len' 在此处使用时未初始化 [-Wuninitialized]

    len++;
    ^~~

main.cpp:16:30:注意:初始化变量 'len' 以消除此警告

long int temp=bin;int len,t,sum=0;
                         ^
                          = 0

您永远不会len在函数中初始化变量check(),因此它包含随机垃圾。此外,即使您正在初始化它,您的check()函数也没有return语句,因此无论它计算什么都会丢失,并且随机垃圾会返回给调用者。

编译器会为您提供如何解决len问题的建议。您可能想sumcheck().


推荐阅读