-1
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct books
{
    char book_name[100];
    char book_author[100];
    int book_id;
};
void print(int j,book[j])
{
        printf("The name of book %d is %s",j,book.book_name);
        printf("\nThe author of book %d is %s",j,book.book_author);
        printf("\nThe id of book %d is %d",j,book.book_id);
}
int main()
{
    int b;
    printf("Enter the number of books :");
    scanf("%d",&b);
    for(int i=1;i<=b;i++)
    {
        struct books book[i];
        printf("Enter the details of book %d /n",i);
        printf("Enter the book %d name:",i);
        scanf("%s",&book[i].book_name);
        printf("\n Enter the author of book %d :",i);
        scanf("%s",&book[i].book_author);
        printf("\n Enter the id of book %d :",i);
        scanf("%d",&book[i].book_id);
    }
    printf("\n The details of the books you entered are given below:\n");
    for(int j=1;j<=b;j++)
    {
        print(int j,book[j]);
    }
    getch();
return 0;
}

エラー: --> [エラー] 'book' は、印刷関数のこのスコープで宣言されていませんでした... 構造体オブジェクトのスコープをグローバルに変更するにはどうすればよいですか? ライブラリのような環境を作成し、構造を使用して本の名前とその詳細を出力していますが、作成されたオブジェクトはスコープを超えています。エラーログにあるように表示されます。問題を解決するのを手伝ってください。

4

2 に答える 2

2

修正コード :- コメントを参照

#include<stdio.h>
#include<conio.h>
#include<string.h>
struct books
{
    char book_name[100];
    char book_author[100];
    int book_id;
};
void print(int j,struct books book ) //Fix arguments use the struct
{
        printf("The name of book %d is %s",j,book.book_name);
        printf("\nThe author of book %d is %s",j,book.book_author);
        printf("\nThe id of book %d is %d",j,book.book_id);
}
int main()
{
    int b;
    printf("Enter the number of books :");
    scanf("%d",&b);
    struct books book[b];  // Declare the array of struct outside.
    for(int i=1;i<=b;i++)
    {
         // Use \n not /n for newline
        printf("Enter the details of book %d \n",i); 
        printf("Enter the book %d name:",i);

        scanf("%s",book[i].book_name);  // Remove & sign, %s expects a char *
        printf("\n Enter the author of book %d :",i);

        scanf("%s",book[i].book_author); // Remove & sign,  %s expects a char *
        printf("\n Enter the id of book %d :",i);
        scanf("%d",&book[i].book_id);
    }
    printf("\n The details of the books you entered are given below:\n");
    for(int j=1;j<=b;j++)
    {
        print(j,book[j]);
    }
    getch();
return 0;
}
于 2013-08-15T06:29:12.573 に答える
0
void print(int j,book[j])

する必要があります

void print(int j , struct books *books)

この

    printf("The name of book %d is %s",j,book.book_name);
    printf("\nThe author of book %d is %s",j,book.book_author);
    printf("\nThe id of book %d is %d",j,book.book_id);

する必要があります

    printf("The name of book %d is %s",j,books-<book_name);
    printf("\nThe author of book %d is %s",j,books->book_author);
    printf("\nThe id of book %d is %d",j,books->book_id);

ここで変更する必要があります:

    print(int j,book[j]);

    print(int j, &book[j]);

ここのように関数を宣言すると

void print(int j,book[j])

欠落しているタイプも指定する必要があります。配列を印刷に渡さずに直接使用する場合は、配列をグローバルにする必要があり、関数で渡す必要はありません。ただし、通常は引数として使用する方が適切です。これは、コードがより適切に分離されるためです。

于 2013-08-15T06:28:04.597 に答える