2010-12-06 5 views
1

Почему следующий код создает ошибку времени компиляции? Я не могу понять, почему типы несовместимы.C Ошибка компиляции Struct

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 

ответ

1

sut.field[0] является char[MAX_CHARS+1]

"Name, " является const char*

Попробуйте это:

strcpy(sut.field[0], "Name, "); 
+0

Благодарим за помощь. Принятие этого ответа, потому что это был самый быстрый и непростой выбор между другими. – Mike 2010-12-06 03:20:32

2

Тип sut.field [0] является массивом размера MAX_CHARS + 1 - вы не можете назначить строковый указатель на массив символов.

Вам нужно либо изменить тип поля csv_line :: на const char *, либо просто выполнить строчную копию литерала «Имя» в целевом массиве.

Обратите внимание, что оба 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]); 
+0

не нужно выполнять эту функцию; он уже существует: `strncpy` и IIRC,` strcpyn` для некоторых компиляторов. – Will 2010-12-06 03:07:22

+0

@ При использовании кода `strncopy` используется` strncpy` внутри. OP добавляет функциональность `strncpy`, которая гарантирует, что строка всегда заканчивается нулем. – mgiuca 2010-12-06 03:12:33

+0

, если это так, тогда не используйте `strncpy` вообще, и делайте это самостоятельно с помощью простого цикла while и скопируйте char с помощью char, не забывая добавить нуль в конец. – Will 2010-12-06 03:17:47

3

Вы пытаетесь присвоить const char * к char[], что это не совсем то же самое. Это будет работать, если ваш f_string были определены как

typedef const char * f_string; 

Что вы ищете здесь

strcpy (sut.field[0], "Name, "); 

Или использовать strncpy, так что вы можете указать размер буфера назначения ..

strncpy (sut.field[0], "Name, ", MAX_CHARS) 

Это позволит вам избежать превышения вашего буфера.

3

Вам нужно использовать что-то вроде:

strcpy(sut.field[0],"Name, "); 

Вы не можете назначить строки, как вы пробовали другие, кроме как initializater во время декларации.

1

Тип sut.field[0] действительно char [MAX_CHARS+1]. Тем не менее, большинство других ответов имеют тип "Name, " неправильный - это фактически тип char [7] (используйте для этого легкую демонстрацию sizeof "Name, ").

Тем не менее, вы по-прежнему не можете назначить char [7]char [MAX_CHARS+1].Вы даже не можете назначить char [7] другому char [7] (инициализация обрабатывается иначе, чем присвоение таким образом).

Ответ, вероятно, заключается в том, чтобы использовать функцию укусов - например, если вы уверены, что MAX_CHARS >= 6, то вы можете просто использовать strcpy(). Если вы не можете быть уверены в длину правильным, то вы можете использовать strncat() в качестве усечение строки копии:

sut.field[0][0] = '\0'; 
strncat(sut.field[0], "Name, ", MAX_CHARS); 

(Обратите внимание, что, несмотря на название, strncpy() является не подходит для этого, и на самом деле очень редко желаемая функция вообще).


Стоит отметить, однако, что вы можете косвенно назначить массивы (одного и того же типа), если они обернуты внутри struct. Это означает, что следующее будет работать (если у вас есть компилятор C99):

typedef struct { char s[MAX_CHARS+1] } f_string; /* string for each field */ 

csv_line sut; 
sut.field[0] = (f_string){"Name, "}; 
Смежные вопросы