Беда со строками в C - PullRequest
       0

Беда со строками в C

5 голосов
/ 27 сентября 2011

Я новичок в мире C, и у меня есть два, вероятно, глупых вопроса.

Я читаю о структурах в C, и вот где я застрял.Допустим, у нас есть такая структура

typedef structs {
  char model[50];
  int yearOfManufacture;
  int price;
} Car;

Car Ford;
Ford.yearOfManufacture = 1997;
Ford.price = 3000;

//The line below gives me an error "Array type char[50] is not assignable
Ford.model = "Focus"

Как передать текст в Ford.model в этом случае?

Мой второй вопрос также касается строк.Этот код отлично работает

char model[50] = "Focus";
printf("Model is %s", model);

Но этот код не

char model[50];
model = "Focus";

Кто-нибудь может объяснить, почему он не работает?

Ответы [ 5 ]

5 голосов
/ 27 сентября 2011

Это не то, как вы копируете строки в C. Попробуйте

strcpy(Ford.model, "Focus");

В качестве альтернативы (но с очень разной семантикой ):

typedef structs {
  char const *model;
  int yearOfManufacture;
  int price;
} Car;

model = "Focus";

Эти часто задаваемые вопросы C объясняют больше о проблеме:

4 голосов
/ 27 сентября 2011

Существует два способа «поместить значения в объекты»:

  • с инициализацией, когда объект создан
  • с присвоением, после создания объекта

Хотя синтаксис схож, но они представляют разные понятия.

Вы можете инициализировать массив, но не можете присвоить ему.

Также есть специальная конструкция для инициализации char массивов на основе строковых литералов

char arr[] = "foobar";
char arr[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
int arr[] = {1, 2, 3, 4};
// ...

но присвоение должно выполняться поэлементно

char arr[4];
arr[0] = arr[1] = arr[2] = 'X';
arr[3] = '\0';
int arr[4];
arr[0] = arr[1] = arr[2] = 42;
arr[3] = -1;

«Специальный» способ присваивать элементам массивов char по одному с помощью одного оператора - использовать библиотечную функцию strcpy() с прототипом в <string.h>

#include <string.h>
int main(void) {
    char arr[10];
    strcpy(arr, "foo"); // same as arr[0]='f'; arr[1]=arr[2]='o'; arr[3]='\0';
    return 0;
}
1 голос
/ 27 сентября 2011

Это (Ford.model = "Focus") невозможно.Вы должны скопировать строку в массив в структуре, лучше всего с strcpy:

strcpy(Ford.model, "Focus");

Если ваш stdlib поддерживает это, вы также должны рассмотреть версию с защитой от переполнения, например strncpy:

strncpy(Ford.model, "Focus", sizeof Ford.model);

По крайней мере, я думаю, что это функция расширения, а не стандартная ... Я не уверен.

0 голосов
/ 27 сентября 2011

Вы можете назначить строку во время определения, но в любом другом месте вы должны использовать другой метод, например, функцию strcpy():

char model[50];
strcpy(model, "Focus");
0 голосов
/ 27 сентября 2011

Вы не можете назначить массив символов с помощью =, вы можете только инициализировать его.

Когда вы пишете

char model[50] = "Focus";

это инициализация.

Когда вы пишете

model = ...

это задание. И, как я уже сказал, присваивание массивам символов не допускается.

Вам необходимо скопировать в массив символов, используя strcpy(), например, strcpy(model, "Focus").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...