-1

下面的程序是获取用户输入的账号,使用类,这是一个预定义的格式——前两位是字母,接下来的三位是分行代码,剩下的十位是一些随机数。如果输入的输入不是格式,它应该提示用户再次输入。我尝试按如下方式实现它。如果我在第一次尝试时给出正确的输入,它可以正常工作,但是当我检查 else 部分代码时,将 'acno' 的值返回到 'tac' 时会出现问题。有人可以纠正代码中的错误吗......谢谢......

#include<iostream>
#include<string>
using namespace std;

class saving
{
    string acc_no,tac;
    string br_code;
    public:
    void input();
} sav;

string chkno(string acno)
{
    string cc,bc,no,ano;
    int i,len,a=1,b=1,c=1;
    for(len=0; acno[len]!='\0'; len++);
    if(len!=15)
    {
        cout<<"Account No. is Invalid.Please enter again.";
        cout<<"\nAccount No : "; cin>>ano;
        chkno(ano);
    }
    else
    {
        cc=acno.substr(0,2);  bc=acno.substr(2,3);  no=acno.substr(5,10);
        for(i=0; i<2; i++)
        {
            if(!isalpha(cc[i]))
            {
                a=0; break;
            }
        }
        for(i=0; i<3; i++)
        {
            if(!isdigit(bc[i]))
            {
                b=0;  break;
            }
        }
        for(i=0; i<10; i++)
        {
            if(!isdigit(no[i]))
            {
                c=0;   break;
            }
        }
        if(a==1&&b==1&&c==1)
        {
           cout<<"\nValid - Account no : "<<acno;
            return acno;
        }  
        else
        {
            cout<<"Incorrect format.Please enter again";
            cout<<"\nAccount No : "; cin>>ano;
            chkno(ano);
        }
    }
}

void saving::input() 
{
    cout<<"Account No : ";
    cin>>acc_no;
    tac=chkno(acc_no);
    acc_no=tac;
    cout<<"\nAcc.No :"<<acc_no;
    br_code=acc_no.substr(2,3);
    cout<<"\nBranch Code is :"<<br_code;
}sav;

int main()
{
 sav.input(); return 0;
}
4

1 回答 1

0

这是错误的

for(len=0; acno[len]!='\0'; len++);

C++ 字符串与 C 字符串不同,它们没有 '\0' 终止符。如果您想知道 C++ 字符串有多长,请执行此操作

len = acno.size();

此外,当您遇到错误时,您会再次调用 chkno,这有点奇怪,但实际上并没有错。但是你做错的是永远不会从第二次调用 chkno 中返回值。你应该做的是这个

cout<<"Incorrect format.Please enter again";
cout<<"\nAccount No : "; cin>>ano;
return chkno(ano);

看看我是如何添加退货的。

对于这个练习的最高分,我认为你应该重新设计你的代码。chkno应该是一个只检查帐号的函数(毕竟这就是它的名字)。所以你应该让它返回一个布尔值,真或假,这取决于帐号是否正确。然后你应该把输入/重新输入你的数字循环放在main中。像这样

bool chkno(string acno)
{
    ...
}

int main()
{
    cout<<"Account No : ";
    cin>>acc_no;
    while (!chkno(acc_no))
    {
        cout<<"Incorrect format.Please enter again";
        cout<<"\nAccount No : ";
        cin>>acc_no;
    }
    ...
}

这是编写此类任务的正常方式。这是更好的设计,因为它更清晰地分离了两个任务,提示用户输入一个数字并检查该数字是否正确。

于 2013-03-28T06:43:24.770 回答