1

私は次の構造体を持っています

typedef char String[256];

typedef struct
{
    String name;
    int year;
    float price;
} Book;

本の配列

int main(int argc, const char * argv[])
{    
    Book books[5];

    for (int i=0; i<5; i++) {
        books[i] = inputBook();
    }

    return 0;
}

inputBook() 関数

Book inputBook()
{
    Book myBook;

    //Name
    puts("Enter Book Name:");
    gets(myBook.name);

    //Publishing Year
    puts("Enter Book Publishing Year:");
    scanf("%i", &myBook.year);

    //Price
    puts("Enter Book Price:");
    scanf("%f", &myBook.price);

    return myBook;
}

どういうわけか最初の本の入力はうまくいっていますが、2 番目の本を入力しようとして、2 回目のinputBook()I can set a book name の呼び出しを行うと、年のインポートに直接ジャンプします。

何が問題ですか ?

ありがとう!

4

5 に答える 5

4

修正するには、以下を置き換えます。

gets(myBook.name);

と:

scanf("%255s", myBook.name); /* 255 as name is 256 chars. */

asscanf()は空白文字をスキップしますが、スキップしgets()ません。改行文字は空白文字と見なされ、入力されたstdin後に改行が残り、改行が読み取られ、事実上何も読み取られなくなります。pricegets()

読む価値があります: warning:gets 関数は危険です

于 2012-07-12T11:06:00.420 に答える
1

次の反復の前に標準入力をフラッシュする必要があると思います。stdin ストリームに以前の CRLF があります。

fflush(stdin) を使用します。ループの最初に。

于 2012-07-12T11:04:05.043 に答える
1

これは、変数 myBook が inputBook スコープでのみ有効であり、関数が終了するとすぐに破棄されるためです。

関数のパラメーターとして、初期化する書籍アイテムを渡す必要があります。

関数 inputBook()...

void inputBook(Book *ptBook )
{
    if( ptBook==NULL )
        return;

    //Name
    puts("Enter Book Name:");
    gets(ptBook->name);

    //Publishing Year
    puts("Enter Book Publishing Year:");
    scanf("%i", &ptBook->year);

    //Price
    puts("Enter Book Price:");
    scanf("%f", &ptBook->price);
}

主な機能は...

int main(int argc, const char * argv[])
{    
    Book books[5];

    for (int i=0; i<5; i++) {
        inputBook( &books[i] );
    }

    return 0;
}
于 2012-07-12T10:58:12.113 に答える
0
#include <stdio.h>

typedef char String[256];

typedef struct
{
    String name;
    int year;
    float price;
    } Book;
Book inputBook()
{
    Book myBook;

    //Name
    puts("Enter Book Name:");
    getchar();
    gets(myBook.name);

    //Publishing Year
    puts("Enter Book Publishing Year:");
    scanf("%i", &myBook.year);

    //Price
    puts("Enter Book Price:");
    scanf("%f", &myBook.price);

    return myBook;
}
int main(int argc, const char * argv[])
{
    Book books[5];

int i = 0; for (i=0; i<5; i++) {
    books[i] = inputBook();
}

return 0;
}
于 2012-07-12T12:10:47.827 に答える
0

入力前に fflush(stdin) を試すことができるかもしれません。

Book inputBook()
{
    Book myBook;

    fflush(stdin);

    // rest of the code
}
于 2012-07-12T10:57:01.443 に答える