2016-03-31 3 views
1
typedef struct Symbol{ 
    char varName[16]; 
} Symbol; 

............... 
Symbol *newSymbol = malloc(sizeof(Symbol)); 
const char space[2] = " "; 


char *String = "Name Test"; 

//break off the first word from String and put it into name 

char *name; 
name = strtok(String,space); 

//convert the char * to char[16] 

char nameArray[16]; 
strcpy(nameArray,name); 

//set newSymbol->varName to the newly created char[16] 

newSymbol->varName = nameArray 

У меня есть char * под названием String. В моей реальной программе она считывается из файла с использованием fgets, я просто называю это «Test Name» для целей этого примера. Я хочу взять первое слово строки и назначить его как varName в Symbol. Итак, что должно произойти, newSymbol->varName настроено на «Name». Потому что strtok возвращает char *, но мне нужен char[16] для структуры, я должен преобразовать char * в char[16].Strcpy from char * to char [] создание неправильной формы

Однако, я получаю эту ошибку:

"Error: incompatible types when assigning to type 'char[16]' from type 'char*' 
newSymbol -> varName = nameArray; 

Таким образом, кажется, как зЬгсру это не на самом деле преобразования char * в char[16]. Даже после объявления char[16] и сообщения strcpy, чтобы поместить в него содержимое char *, у меня все еще есть char * вместо char[16]. Мне нужно заставить его работать, не меняя структуру, так что это не вариант.

Как можно преобразовать char * в char[16]?

+2

Hmmm 'char * String =" Name Test "; ... name = strtok (String, space); 'выглядит iffy, пытаясь изменить строковый литерал, я думаю. – chux

+0

Вы совершенно правы, @chux, но я принимаю это за ошибку, которую OP представил в процессе сокращения его исходного кода до примера, который он представил. –

ответ

2

Вы не можете присвоить содержимое массива с помощью регулярного оператора о назначении на C.

Вы можете использовать strcpy для строк и memcpy/memset для других типов данных. (Вы можете использовать memcpy/memset для строк тоже, но strcpy проще)

Вместо того

newSymbol -> varName = nameArray; 

использование

strcpy(newSymbol -> varName, nameArray); 
+0

Я пробовал это, и это сработало, спасибо за помощь! –

+0

@JacobL., Пожалуйста. –

2

So, it seems like strcpy it not actually converting the char* to a char[16].

Нет, проблема в том, что C не предусматривает присвоения (целых) массивов. newSymbol->varName - это массив из 16 char. Вы можете назначить элементам этого массива, и вы можете скопировать в него strcpy() или аналогичную функцию, но вы не можете назначить весь массив.

В вашем конкретном коде я бы обойтись без переменной nameArray, изменение этого ...

strcpy(nameArray,name); 

... к этому:

strcpy(newSymbol->varName, name); 

(Или, возможно, к подобному использованию strncpy(), чтобы защитить от превышения границ массива.)