C ++无法在函数中编辑字符串

时间:2015-03-10 19:58:19

标签: c++ string function

我很难过。真的无法解决这个问题。

int main(){
    string blah = "text";
    example(&blah);
}

void example(string *h){
    *h[3]='l';
}

我在上面的函数中尝试做的是编辑原始字符串的第4个字符而不使用全局变量。我以为这会起作用,因为我知道我可以用int来做类似的事情。猜测它与字符串/字符转换有关,但我无法在网上找到太多信息。

3 个答案:

答案 0 :(得分:7)

那不是C,它是C ++,通过引用传递,让你的生活更轻松:

void example(string & h){
    h[3]='l';
}

将它作为C ++中的指针(在特定的用例中)传递是没有意义的,那就是" C风格"通过引用传递,通过在C ++中引入引用而过时。

通常情况下,如果您打算使用指针运算,那么您想要作为指针传递,这些东西大部分已被C ++标准库容器淘汰,或者为了符合某些已建立的库API - 有很多人大量使用指针,但意图与你的用例略有不同。

BTW,std::string有一个at()方法,使用指针可能会更优雅一些:

h->at(3) = 'l';

当然,你也可以从指针调用[]运算符作为函数:

h->operator [](3) = 'l';

但它有点挫败了目的。

答案 1 :(得分:2)

执行:(*h)[3]='l';

由于运算符优先级而发生,[]位于*之前。

答案 2 :(得分:1)

问题很简单:由于运营商优先权,*h[3]相当于*(h[3]),而不是(*h)[3]

有三种方法可以避免这种情况:

  1. 更改界面:
  2. 在C ++中,您可以通过引用传递对象

    void example(std::string& h)
    //                      ^
    {
        h[3] = '1';
    }
    

    对函数h内的example所做的所有更改都在“函数外部”可见。

    1. 按原样保留界面:
    2. 如果无法更改界面,您可能仍然可以让您的生活更轻松

      void example(std::string* h_ptr)
      {
          assert( h_ptr != nullptr ); // make sure you didn't pass a NULL pointer
          std::string& h = *h_ptr;    // create a reference from a non-NULL pointer
          h[3] = '1';
      }
      
      1. 绝对准确,生活在一个危险的世界:
      2. 您必须非常小心运算符优先级。最好避免这种解决方案。

        void example(std::string* h)
        {
           (*h)[3] = '1'; // be explicit on the order you want (you will often make mistakes!)
        }