可以在递归函数中清除变量吗?

时间:2020-06-15 13:31:54

标签: c++ variables recursion

我正在尝试构建一个程序,其中将您的姓名和姓氏作为输入(到目前为止),并将其传递给即将到来的函数。现在,我正在尝试在递归函数中重置变量,因为我想到了以下情况:如果有人以某种方式弄乱了他们的姓名,我想给他们一个机会再写一次...但是程序不会删除“不良”数据,并保留该数据,无论用户将其姓名写错了多少次。到目前为止,这是代码:

#include <iostream>

using namespace std;

string name_data()
{
    string name;
    string surname;

    cout<<"Welcome to CV/resume creator. Please enter your surname: "<<endl;
    cin>>surname;

    cout<<endl<<"Now please enter your name: "<<endl;
    cin>>name;

    bool false_characters=false;
    string unallowed="!@#$%^&*()1234567890";

    for(int i=0; i<unallowed.size(); i++){
        for(int j=0; j<surname.size(); j++){
            if(unallowed[i]==surname[j]){
                cout<<"Sorry, your surname cannot possibly contain those characters in it (unless you're Elon Musk's heir).\nReturning to beginning..."<<endl;
                false_characters=true;
                name_data();
            }
        }
        for(int k=0; k<name.size(); k++){
            if(unallowed[i]==name[k]){
                cout<<"Sorry, your name cannot possibly contain those characters in it (unless you're Elon Musk's heir).\nReturning to beginning..."<<endl;
                false_characters=true;
                name_data();
            }
        }
    }

    string confirmation;
    if(false_characters!=true){
        cout<<endl<<"Your name is "+surname+" "+name+". Is that correct?"<<endl;
        cin>>confirmation;
        if(confirmation=="no"){
            cout<<"Back to beginning..."<<endl<<endl;
            surname.clear();
            name.clear();
            name_data();
        }
    }
    string full_name=surname+" "+name;
    return full_name;
}

int main()
{
    cout<<name_data();
    return 0;
}

3 个答案:

答案 0 :(得分:3)

当您需要更正数据时,请调用:let g:netrw_browsex_viewer= "firefox -P user" ,它会执行,然后返回到数据损坏的范围。相反,您需要使数据不正确的范围返回新范围中的数据,因此请执行以下操作。使它不仅返回呼叫,而且

name_data();

请注意,在进行的每个调用堆栈中都有独立的数据,因此不需要if(confirmation=="no"){ cout<<"Back to beginning..."<<endl<<endl; return name_data(); }

最好将递归样式更改为

clear()

避免了数据成本和重复成本。

答案 1 :(得分:2)

您已在函数中声明了SessionServicename局部变量。当您再次调用该函数时,将创建这些变量的另一个副本。要使用递归调用中收集的值,您必须返回它们并将其存储在调用代码中,但您的递归调用语句

surname

删除返回值。您可以:

  • 要么保留递归调用返回的数据,然后使用它们代替原始数据(例如name_data();
  • 或重写您的函数以使用循环而不是递归。

答案 2 :(得分:1)

非常感谢你们提供的解决方案。现在,我根据您的提示和建议进行了更正,它可以按我的意愿工作。这是针对感兴趣的人的修改后的代码:

#include <iostream>

using namespace std;

string name_data()
{
    string name;
    string surname;

    cout<<"Welcome to CV/resume creator. Please enter your surname: "<<endl;
    cin>>surname;

    cout<<endl<<"Now please enter your name: "<<endl;
    cin>>name;

    bool false_characters=false;
    string unallowed="!@#$%^&*()1234567890";

    for(int i=0; i<unallowed.size(); i++){
        for(int j=0; j<surname.size(); j++){
            if(unallowed[i]==surname[j]){
                cout<<"Sorry, your surname cannot possibly contain those characters in it (unless you're Elon Musk's heir).\nReturning to beginning..."<<endl;
                false_characters=true;
                return name_data();
            }
        }
        for(int k=0; k<name.size(); k++){
            if(unallowed[i]==name[k]){
                cout<<"Sorry, your name cannot possibly contain those characters in it (unless you're Elon Musk's heir).\nReturning to beginning..."<<endl;
                false_characters=true;
                return name_data();
            }
        }
    }

    string confirmation;
    if(false_characters!=true){
        cout<<endl<<"Your name is "+surname+" "+name+". Is that correct?"<<endl;
        cin>>confirmation;
        if(confirmation=="no"){
            cout<<"Back to beginning..."<<endl<<endl;
            return name_data();
        }
    }
    string full_name=surname+" "+name;
    return full_name;
}

int main()
{
    cout<<name_data();
    return 0;
}

相关问题