为什么以下代码会产生编译时错误?我似乎无法理解为什么这些类型不匹配。
typedef char f_string[MAX_CHARS+1] ; /* string for each field */
/*
* A parsed CSV line, with the number of fields and upto MAX_FIELDS themselves.
*/
typedef struct {
int nfields ; /* 0 => end of file */
f_string field[MAX_FIELDS] ; /* array of strings for fields */
} csv_line;
....
csv_line sut;
sut.field[0] = "Name, "; //Compile-time error.
错误是:
error: incompatible types in assignment
答案 0 :(得分:3)
您正在尝试将const char *
分配给char[]
,这不是一回事。如果您的f_string
被定义为
typedef const char * f_string;
您在这里寻找的是
strcpy ( sut.field[0], "Name, " );
或使用strncpy
以便您可以指定目标缓冲区的大小..
strncpy ( sut.field[0], "Name, ", MAX_CHARS )
这会阻止你超越你的缓冲区。
答案 1 :(得分:3)
你需要使用类似的东西:
strcpy( sut.field[0],"Name, ");
除了在声明时作为初始化者,你不能像你尝试过的那样分配字符串。
答案 2 :(得分:2)
sut.field [0]的类型是大小为MAX_CHARS的字符数组+ 1 - 您不能将字符串指针指定给字符数组。
您需要将csv_line :: field的类型更改为const char *,或者只是将文字“Name”的字符串副本更改为目标数组。
请注意,仅strcpy()
和strncpy()
都不安全:第一个可能会溢出缓冲区,第二个可能会在没有NUL终结符的情况下离开它。即使你“知道”你的字符串不会溢出,你也必须意识到这些情况。
使用辅助函数安全地执行此操作:
char * strncopy(char *dst, const char *src, int dstsize)
{
strncpy(dst, src, dstsize-1);
dst[dstsize-1] = '\0';
return dst;
}
然后:
strncopy(sut.field[0], "Name, ", sizeof sut.field[0]);
答案 3 :(得分:1)
sut.field[0]
是char[MAX_CHARS+1]
"Name, "
是const char*
试试这个:
strcpy(sut.field[0], "Name, ");
答案 4 :(得分:1)
sut.field[0]
的类型确实是char [MAX_CHARS+1]
。但是,大多数其他答案的"Name, "
类型错误 - 它实际上是char [7]
类型(使用sizeof "Name, "
可以轻松演示此内容。)
尽管如此,您仍然无法直接将char [7]
分配给char [MAX_CHARS+1]
。您甚至无法直接将char [7]
分配给另一个char [7]
(初始化会以这种方式与分配区别对待)。
答案可能只是使用coyping函数 - 例如,如果您确定MAX_CHARS >= 6
,那么您可以使用strcpy()
。如果您无法确定长度是否正确,那么您可以使用strncat()
作为截断字符串副本:
sut.field[0][0] = '\0';
strncat(sut.field[0], "Name, ", MAX_CHARS);
(请注意,尽管有名称,但strncpy()
不适用于此,实际上很少是所需的功能。)
但是,值得指出的是,如果数组({1}}包含在内,可以间接分配数组(相同类型)。这意味着以下内容将起作用(如果您有C99编译器):
struct