通过引用传递std :: string不会更新调用函数中的字符串值

时间:2017-09-03 19:16:15

标签: c++ string

我正在尝试从字符串中删除重复项。代码如下:

#include<iostream>
#include<stdio.h>
#include<string.h>

void removeDup(std::string s, std::string &ex)
{
    int hash[256] = {0};
    int k = 0;
    for (int i = 0; i < s.size(); ++i)
    {
        if (hash[s[i]] == 0)
        {
            ex[k++] = s[i];
            //std::cout<<ex[k-1];
        }
        hash[s[i]] = 1;
    }
}

int main()
{
    std::string s;
    std::getline(std::cin, s);
    std::string ss;

    removeDup(s, ss);
    std::cout<<ss<<std::endl;
    return 0;
}

现在在main函数中我打印了ss的值(在removeDup函数中作为引用传递)但是它什么都没打印。为什么会这样?字符串元素的值是否在被调用函数中更新?

此外,当我按地址传递字符串时,我只是打印出第一个值。

例如:

void removeDup(std::string s, std::string *ex)
{
    // same as above body function body
}

int main()
{
......
    removeDup(s, &ss);
    std::cout<<ss<<std::endl;
    return 0;
}

在输出中,我只得到s中的第一个字母。我无法理解。我对编程语言中的字符串不是很熟悉。请帮助。

1 个答案:

答案 0 :(得分:2)

这归结为std::string::operator[](size_t index)期望index超过该字符串&#39; s size()的事实。

这意味着您需要使用constructor (variant 2)初始化ss,并使用size() ' '个值hello.cc3:25: fatal error: gstreamermm.h: No such file or directory 来填充它,或者,更好的是,使用push_back()(理想情况下与reserve()结合使用,作为将元素附加到输出字符串的方法。