Ваша структура содержит указатели на строки, а не массивы. Когда вы выделяете его с помощью malloc()
, вы должны инициализировать эти указатели для некоторого выделения памяти для sscanf()
для хранения. Как сообщалось, код имеет неопределенное поведение. Кроме того, вы должны проверить наличие ошибок выделения, а также проверить количество преобразований, возвращаемых sscanf()
, чтобы обнаружить неверный ввод.
Если ваша библиотека C поддерживает общее расширение, модификатор выделения m
, вы можно написать так:
typedef struct {
char *location;
char *direction;
int length;
char *name;
} Ship;
Ship *create_ship(const char *line) {
Ship *newShip = calloc(sizeof(Ship), 1);
if (newShip) {
if (sscanf(line, "%ms %ms %d %m[^\n]", &newShip->location,
&newShip->direction, &newShip->length, &newShip->name) == 4)) {
printf("\nShip %d:\n\tLocation: %s\n\tDirection: %s\n"
"\tLength: %d\n\tName: %s\n", shipNum, newShip->location,
newShip->direction, newShip->length, newShip->name);
} else {
/* format error */
free(newShip->location);
free(newShip->direction);
free(newShip);
newShip = NULL;
}
}
return newShip;
}
Для более простого и переносимого подхода вы можете определить строковые поля в Ship
как массивы char
и использовать:
typedef struct {
char location[20];
char direction[4];
int length;
char name[50];
} Ship;
Ship *create_ship(const char *line) {
Ship *newShip = calloc(sizeof(Ship), 1);
if (newShip) {
if (sscanf(line, "%19s %3s %d %49[^\n]", newShip->location,
newShip->direction, &newShip->length, newShip->name) == 4)) {
printf("\nShip %d:\n\tLocation: %s\n\tDirection: %s\n"
"\tLength: %d\n\tName: %s\n", shipNum, newShip->location,
newShip->direction, newShip->length, newShip->name);
} else {
/* format error */
free(newShip);
newShip = NULL;
}
}
return newShip;
}