примечание: ожидаемый ‘char *’, но аргумент имеет тип ‘int *’

#c #struct #types

#c #структура #типы

Вопрос:

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

 #define MAXSIZE 100

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

int main() {
    Book BookList;

    strcpy(BookList.ISBN, "9780133432398");

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

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

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

Итак, я меняю BookList.ISBN следующим образом: BookList.ISBN = "9780133432398";

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

 error: assignment to expression with array type
  

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

Комментарии:

1. вместо этого измените int ISBN[13]; на char ISBN[14]; .

2. @Blaze Что мешает вам превратить это в ответ? С небольшим объяснением это может быть даже с возможностью увеличения.

3. @Yunnosch обычно, когда я пытаюсь ответить на подобные вопросы, он закрывается как дубликат на полпути написания моего ответа.

Ответ №1:

Использование 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;
  

Ответ №2:

Хотя вы могли бы изменить свой 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;
}