【问题标题】:Function returning string in C++ [closed]C++中的函数返回字符串[关闭]
【发布时间】:2013-03-18 12:41:08
【问题描述】:

下面的程序是获取用户输入的账号,使用class,它是一个预定义的格式——前两位是字母,接下来的三位是分行代码,剩下的十位是一些随机数。如果输入的输入不是格式,它应该提示用户再次输入。我尝试按如下方式实现它。如果我在第一次尝试时给出正确的输入,它可以正常工作,但是当我检查 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;
}

【问题讨论】:

  • 我们可以看到错误吗?
  • 通过 chkno 函数的多个路径从未命中 return 语句。

标签: c++ string class function return


【解决方案1】:

这是错误的

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;
    }
    ...
}

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

【讨论】:

  • 他再次调用chkno并不奇怪——他说他想在验证失败时重新提示用户。但你是对的,问题在于他没有返回结果。
  • 设计不寻常。通常 chkno 会返回一个布尔值(它只是检查一个数字是否正确),并且提示循环应该在 main 中。
  • 非常感谢!!!添加 return 使程序完美运行.....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多