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

Ava*_*Ava 5 c++ char

我把c定义为

char c[][10]
Run Code Online (Sandbox Code Playgroud)

在函数定义中使用它 c[i]="gray";

怎么了?我在网上搜索,它显示相同的语法.

谢谢.

asc*_*ler 11

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

const char *c[20];
c[i] = "gray";
Run Code Online (Sandbox Code Playgroud)

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

char c[20][10];
strncpy(c[i], "gray", sizeof(c[i]));
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 11

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

如果您知道目标数组足以容纳所需的字符串,则可以使用strcpy这样复制字符串:

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

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

strlcpy(c[i], "gray", 10);  // 10 is the size of c[i]
Run Code Online (Sandbox Code Playgroud)

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

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);    
}
Run Code Online (Sandbox Code Playgroud)

千万不能使用strncpy,因为它可能会留下一个非空结尾的字符串