这是我的第一篇文章,我真的很抱歉我会做的...... 我有问题,我需要快点,我做错了什么? 它毗邻了一个"图书馆"关于结构的程序 我有文件:带有这种结构的标题
#include <stdio.h>
//Strutture
struct Date{short day, month, year;};
enum genre{thriller, novel, fantasy, horror};
struct Book{char title[64];
char writer[32];
enum genre bookGenre;
struct Date published;
short inLibrary;
short outLibrary;
short id;
};
然后是一个c文件,这个文件只包含定义; main将在另一个.c文件中:
#include "mylib.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
...
//To add new book
Book_t *newBook(){
Book_t *bPtr;
if ((bPtr = calloc(1,sizeof(Book_t))) == NULL){
printf("I'm sorry, I couldn't reserve enough memory\n");
}
else{
...
//Book genre
while(genreOk ==0){
printf("Insert new book's genre(0=thriller, 1=novel, 2=fantasy, 3=horror): ");
scanf("%d",&t);
if(-1< t <4){
(*bPtr).genre = t;
genreOk =1;
}
else{
printf("\nInapropriate genre, try again");
}
printf("\n");
}
//Data libro
while(dateOk ==0){
printf("Insert new book's day of publish: ");
scanf("%d", &dayT);
printf("\nInsert new book's month of publish: ");
scanf("%d", &monthT);
printf("\nInsert new book's year of publish: ");
scanf("%d", &yearT);
dateOk = checkDate(dayT, monthT, yearT);
if (dateOk == 1){
(*bPtr).Date.day = dayT;
(*bPtr).Date.month = monthT;
(*bPtr).Date.year = yearT;
}
printf("\n");
}
More messy code
当我尝试使用gcc -c mylib.c进行编译时出现此错误:
mylib.c: In function newBook:
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'genre'
(*bPtr).genre = t;
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'Date'
(*bPtr).Date.day = dayT;
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'Date'
(*bPtr).Date.month = monthT;
mylib.c: error: 'Book_t {aka struct Book}' has no member named 'Date'
(*bPtr).Date.year = yearT;
我在Windows 10计算机上使用Virtual Box和Ubuntu
答案 0 :(得分:0)
genre
和Date
是结构中字段的类型。
bookGenre
和published
是结构中字段的名称。
所以,例如,你写的地方:
(*bPtr).Date.day = dayT;
这是正确的:
(*bPtr).published.day = dayT;
BTW,几乎每次使用->
代替(* ).
,因为它更容易,更快速,更简单:
bPtr->published.day = dayT;
答案 1 :(得分:0)
您的代码有两个问题:
book
结构中,成员名称为bookGenre
,其类型为enum genre
。您可以按标识符而不是按类型访问结构成员。因此,您需要编写(*book).genre
。(*book).bookGenre
t
来电之前声明变量scanf
。您可以使用do
实现类型验证循环,如下所示:
enum genre input;
do {
printf("What is the genre?\n");
} while (scanf("%d", &input) != 0 && input >= 0 && input <= 3);
do
循环将至少执行一次,因为在循环体完成后评估条件。这在这里是有道理的,因为我们首先询问用户问题,然后检查他是否输入了一个数字(scanf("%d", &input) != 0
)并且它在[0, 3]
范围内。如果条件尚未满足,则再次询问用户该问题,并且这将继续直到用户键入有效类型。请注意我们如何直接读入enum genre
,而不是int
- 这是因为int
可以隐式地分配给enum
,而不需要任何强制转换。< / p>
顺便说一句,您可以使用->
访问结构指针成员。例如,代替(*book).genre
,您可以编写book->genre
。
答案 2 :(得分:0)
另外,这个:
if(-1< t <4) ...
不起作用。 这样:
int t;
if ( (-1 < t) && (t < 4) ) ...
意愿。