注意:预期为'char *',但参数的类型为'int *'

时间:2019-04-05 13:33:32

标签: c struct types

这是代码,这将输出正确的答案。

#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.ISBNBookList.ISBN = "9780133432398";

但随后gcc输出此错误:

error: assignment to expression with array type

只是想不通...

2 个答案:

答案 0 :(得分:2)

使用strcpy()并不是问题(而是正确的做法),请检查类型,这就是编译器在抱怨的问题。

ISBN数组中的int变量实际上应该是char s数组。

也就是说,要使char数组被限定为 string ,它必须以空字符终止。要保留该空字符,您需要在实际内容上方留出另一个char的空间。

因此,要保留13个字符的输入,数组的长度至少应为14。

您需要更改

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

#define BNSIZE 14            // easy configuration
typedef struct {
    char ISBN[BNSIZE];
}Book;

答案 1 :(得分:0)

虽然您可以像其他人建议的那样将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;
}