c++ - String & 没有反射(reflect)所做的更改但是 String 确实……在传递参数时?

标签 c++ string recursion pass-by-reference

问题 - 给定一个字符串 '0'、'1' 和 '?'。生成所有可能的字符串,您可以在其中替换“?”用“0”或“1”?

例如 - 输入 - “0??” 输出 - “000”、“001”、“010”、“011”。

我已经为它写了一个简单的程序——

void gen(string& str, int index)
{
    int i;
    if(str.length() == index)
    {
        cout << str << endl;
        return;
    }
    else
    {
        for(i=index; str[i]!='\0' && str[i]!='?';i++);

        if(str[i] == '?')
        {
            str[i] ='0';
            gen(str,i+1);
            str[i] ='1';
            gen(str,i+1);
        }
    }
    return;
}

int main()
{
    string s ="0??";
    gen(s, 0);
    return 0;
}

它不能正常工作.... 但是,如果您将 void gen(String &, int) 中的参数替换为

void gen(String, int)....

然后它将正常工作..

谁能给我解释一下....

最佳答案

当您通过引用 传递字符串时,所有对gen() 的递归调用都会对一个字符串进行操作。 - 而不是每次调用 gen()在自己的本地拷贝上工作。每次递归调用 gen()修改(共享)字符串,删除所有“?”人物;当该电话返回时,不再有“?”剩下的字符要处理,所以它只是终止。

当您按值传递字符串时,每次调用 gen()函数获取自己的字符串本地拷贝;当函数返回到上一级时,它对该字符串所做的任何更改都将被丢弃和遗忘。在这种情况下,您的逻辑是正确的。

(还有一个错误导致它在我的 Windows 机器上崩溃,直到我修复它:std::string 不是空终止的,所以与其检查 std[i] == '\0' 你应该做类似 i < str.length() 的事情。)

关于c++ - String & 没有反射(reflect)所做的更改但是 String 确实……在传递参数时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21717160/

相关文章:

c - strcpy 与直接赋值 : Overflow issue

java - java中的递归方法

python - 如何找到整数 1,2,3 加起来等于 n 的方式数?

C++ 类对非类型模板参数的部分特化

c++ - 执行限定名称查找时 Clang 和 GCC 之间的不同行为

c++ - 分段故障

string - 数字到字符串 - 如何将 150 变成 "One Hundred and Fifty"

C++:同一命名空间中类名的标识符未定义

javascript - 如何通过计算用户在textarea中输入的文本长度来输入特定标签?

c++ - 递归和返回 boolean 值