примечание: ожидается 'char *', но аргумент имеет тип 'int *' - PullRequest
0 голосов
/ 05 апреля 2019

Вот код, и он выведет правильный ответ.

#define MAXSIZE 100

typedef struct {
    int ISBN[13];
}Book;

int main() {
    Book BookList;

    strcpy(BookList.ISBN, "9780133432398");

    printf("ISBN of the book: %s\n", BookList.ISBN);
    return 0;
}

А также, gcc сказал, что есть предупреждение:

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int *' [-Wformat=]

Итак, я изменяю BookList.ISBN какthis: BookList.ISBN = "9780133432398";

Но тогда gcc выдает эту ошибку:

error: assignment to expression with array type

Просто не могу понять это ...

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Использование strcpy() не является проблемой (скорее, это правильно), проверьте типы, на что жалуется компилятор.

Переменная ISBN в массиве int s, когда это действительно должен быть массив char s.

Тем не менее, чтобы массив char был квалифицирован как строка , его необходимо завершитьнулевым символом.Чтобы сохранить этот нулевой символ, вам нужно иметь пробел для другого char, сверх фактического содержимого.

Таким образом, для хранения 13-символьного ввода массив должен иметь длину 14, вминимум.

Вам нужно изменить

typedef struct {
    int ISBN[13];
}Book;

на

#define BNSIZE 14            // easy configuration
typedef struct {
    char ISBN[BNSIZE];
}Book;
0 голосов
/ 05 апреля 2019

Хотя вы можете изменить свой ISBN на char[], как предлагают другие, я нахожу любопытным использовать строку для хранения числа. Вместо этого я бы выбрал целочисленный тип без знака, который может содержать достаточно цифр, чтобы соответствовать 13-значному ISBN.

#include <stdint.h>
#include <inttypes.h>

typedef struct {
    uint_least64_t ISBN;
}Book;

int main() {
    Book BookList = {.ISBN=9780133432398};

    printf("ISBN of the book: %" PRIuLEAST64 "\n", BookList.ISBN);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...