以下程序是使用具有预定义格式的类来输入用户输入的帐号 - 前两个是字母表,接下来的三个数字是分支代码,其余十个数字是一些随机数。如果输入的输入不是格式,则应提示用户再次输入。我尝试按如下方式实现它。如果我在第一次尝试时给出正确的输入它可以正常工作,但是当我检查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;
}
答案 0 :(得分: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
应该是一个只检查帐号的功能(毕竟这就是它的名称)。所以你应该让它返回一个布尔值,true为false,具体取决于帐号是否正确。然后你应该输入/重新输入你的数字循环在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;
}
...
}
这是编写此类任务的正常方式。这是更好的设计,因为它可以更清晰地分离两个任务,提示用户输入一个数字并检查该数字是否正确。