错误:将'const char [5]'赋值给'char [10]'时出现不兼容的类型

时间:2011-03-24 02:46:02

标签: c++ char

我已将c定义为

char c[][10]

在函数定义中,并像c[i]="gray";

一样使用它

什么错了?我在网上搜索,它显示了相同的语法。

感谢。

4 个答案:

答案 0 :(得分:10)

您不能在数组上使用赋值(=)。如果将c更改为指针数组,则可能会有效,具体取决于您需要执行的操作。

const char *c[20];
c[i] = "gray";

或者,如果声明的类型必须是数组数组,则可以使用strncpy

char c[20][10];
strncpy(c[i], "gray", sizeof(c[i]));

答案 1 :(得分:9)

问题是数组不能在C中赋值。像"gray"这样的字符串常量是字符数组常量:在这种情况下,类型是char[5](4 + 1表示终止空值)。 / p>

如果你知道目标数组足够大以容纳所需的字符串,你可以使用strcpy复制字符串,如下所示:

// Make sure you know that c[i] is big enough!
strcpy(c[i], "gray");

更好的想法是使用更安全的功能,例如strlcpy(基于BSD的系统和Mac OS X)或strcpy_s(Windows):

strlcpy(c[i], "gray", 10);  // 10 is the size of c[i]

但是,这些功能是特定于平台的,并非所有便携式功能。如果速度不是问题,您也可以推出自己的实现:

size_t strlcpy(char *dst, const char *src, size_t size)
{
    size_t len = 0;
    while(size > 1 && *src)
    {
        *dst++ = *src++;
        size--;
        len++;
    }
    if(size > 0)
        *dst = 0;
    return len + strlen(src);    
}

使用strncpy,因为it could potentially leave you with a non-null-terminated string

答案 2 :(得分:1)

尝试使用strcpy()(在cstring标题中找到),而不仅仅是简单的分配。

答案 3 :(得分:0)

此代码将以3种不同的方式工作并进行正确的分配:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    string myString = "hello my friends from Brazil";
    char charOut[myString.size()];
    strncpy(charOut, myString.c_str(), myString.size());
    std::cout << "Char by strncpy string var  " << charOut << std::endl;

    const char *charOut2;
    charOut2 = "sup my homies in L.A.";
    std::cout << "Char by const  " << charOut2 << std::endl;

    string myString2 = "hallo mein bruder in Berlin";
    char charOut3[myString2.size()];
    strcpy(charOut3, myString2.c_str());
    std::cout << "Char by strcpy string var  " << charOut3 << std::endl;
}

在ubuntu服务器上运行正常。没有在其他系统上测试。