我已将c定义为
char c[][10]
在函数定义中,并像c[i]="gray";
什么错了?我在网上搜索,它显示了相同的语法。
感谢。
答案 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服务器上运行正常。没有在其他系统上测试。