Назначение указателя char на массив char в C

Я начинаю изучать C, и у меня уже есть несколько проблем. Я хочу проанализировать файл и сохранить результаты каждой строки в структуре. Моя структура выглядит так:

struct record {
    char x[100];
}

Затем, всякий раз, когда я использую strtok для анализа строки в каком-либо файле.txt,

struct record R;
...
char *token;
token = strtok(line, "\t");

token возвращает указатель на строку, и всякий раз, когда я ее печатаю, это правильная строка. Я хочу назначить токен x, например R.x = token, но получаю сообщение об ошибке: «char x[100] не может быть назначен». Можно ли преобразовать этот токен указателя в фактический массив символов или как лучше всего сохранить результаты в структуре?


person Sam    schedule 11.04.2015    source источник
comment
Вы не можете назначать такие массивы. Используйте memcpy(), чтобы заполнить его данными, которые вы хотите, чтобы он содержал.   -  person Bregalad    schedule 11.04.2015


Ответы (3)


Ошибка говорит обо всем. Массивы нельзя назначать. Вам нужно скопировать каждый символ один за другим, а затем добавить в конце NUL-терминатор.

К счастью, есть функция, которая делает это за вас. Имя функции — strcpy, и оно находится в заголовке string.h.

Чтобы устранить проблему, используйте

strcpy(R.x,token);

вместо

R.x = token;
person Spikatrix    schedule 11.04.2015

strcpy останавливается, когда встречает NULL, memcpy — нет. Итак, если у вас есть массив 0x00, например. \0 в середине, вы должны использовать memcpy, а не strcpy.

person Shihe Zhang    schedule 03.05.2017

Используйте strcpy после того, как убедитесь, что строка помещается в массив:

#define LEN(array) (sizeof (array) / sizeof (array)[0])

if (strlen(token) < LEN(R.x)) {
   strcpy(R.x, token);
} else {
   fprintf(stderr, "error: input string \"%s\" is longer than maximum %d\n", token, LEN(R.x) - 1);
}
person August Karlstrom    schedule 11.04.2015