如何在没有任何临时char数组作为变量的情况下将字符数组传递给C ++中的函数?

时间:2014-06-07 18:10:11

标签: c++ arrays string-literals

我有以下代码

void func(char c[])  {
    c[1]= '@';
    std::cout<<c<<"\n"
             <<sizeof(c)<<"\n";
}

// Main 1
int main()  {
    char temp[6] = "pinta";
    func(temp);
}

如果我将主要功能更改为以下

//Main 2
int main()
{
    func("pinta");
}

meow@vikkyhacks ~/Arena/c/LinkedList $ g++-4.8 scrap/test.cpp 
scrap/test.cpp: In function ‘int main()’:
scrap/test.cpp:12:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
  func("pinta");
              ^

经过一些谷歌搜索后,我了解到第二个main没有传递任何字符数组而是传递read only string literal,当命中c[1] = '@'时会抛出一个seg错误。

我的问题是

  1. 如何避免使用用于的temp变量 Main 1并直接将字符数组传递给func 它的参数?

  2. 重要条件是允许编辑角色 数组传递到func

  3. 修改

    我看到有许多答案阻止我做c[1]= '@';,这是我无法做到的,因为这条线对我来说非常重要。

2 个答案:

答案 0 :(得分:7)

您无法避免创建临时文件,因为写入字符串文字的内存是非法的,但您可以让编译器为您创建它。以参数std::string代替 - 这比char数组更安全,并为您创建副本。

答案 1 :(得分:2)

这样做的一种方法是:

template<int N>
void func(char const (&c)[N])  
{
    // c[1] = '@'; you cannot assign to variable that is const
    std::cout << c << "\n"
        << sizeof(c) << "\n";
}


int main()
{
    func("pinta");  
    return 0;
}

但是请注意,您只将临时值绑定到const引用。

上面你实际上是对一个数组的引用传递,该数组的大小与你给出的字符串文字的长度+ 1(= \0)一样大。

Demo


如果您需要func内的可修改变量,那么您需要char数组的副本:

template<int N>
void func(char const (&c)[N])  
{
    char cp[N];
    copy(begin(c), end(c), cp); 
    auto len = distance(begin(cp), end(cp));

    if (len > 1) cp[1] = '@';
    std::cout << cp << "\n"
        << sizeof(cp) << "\n";
}

我还添加了一些范围检查(它是len部分)