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;
}

由于某种原因,第一本书的输入进展顺利,但是当尝试输入第二本书和第二次调用inputBook()我可以设置书名时,它会直接跳转到年份导入。

问题是什么 ?

谢谢!

4

5 回答 5

4

要更正,请替换:

gets(myBook.name);

和:

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

asscanf()将跳过任何空白字符,但gets()不会。stdin换行符被认为是一个空白字符,并且在输入之后会有一个换行符,price导致gets()读取换行符并且实际上什么也没读。

值得一读:警告:gets 函数很危险

于 2012-07-12T11:06:00.420 回答
1

这是因为变量 myBook 仅在 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 回答
1

我认为您需要在下一次迭代之前刷新标准输入。您的标准输入流中有 orevious CRLF。

使用 fflush(stdin); 在循环的开始。

于 2012-07-12T11:04:05.043 回答
0

也许您可以在输入之前尝试 fflush(stdin) 。

Book inputBook()
{
    Book myBook;

    fflush(stdin);

    // rest of the code
}
于 2012-07-12T10:57:01.443 回答
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 回答