C结构阵列输入

时间:2012-07-12 10:50:57

标签: c printf scanf gets puts

我有以下结构

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()时,我可以设置一个书名,它会直接跳到年份导入。

有什么问题?

谢谢!

5 个答案:

答案 0 :(得分:4)

要更正,请更换:

gets(myBook.name);

使用:

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

因为scanf()会跳过任何空格字符,但gets()则不会。换行符被视为空格字符,输入stdinprice会有换行符,导致gets()读取换行符并有效读取内容。

值得一读:warning:gets function is dangerous

答案 1 :(得分:1)

这是因为变量myBook仅在inputBook范围内有效,并在函数退出后立即销毁。

您应该将要初始化的书籍项目作为函数的参数传递。

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

答案 2 :(得分:1)

我认为你需要在下一次迭代之前刷新stdin。您的stdin流中有以前的CRLF。使用fflush(stdin);在循环的开头。

答案 3 :(得分:0)

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

Book inputBook()
{
    Book myBook;

    fflush(stdin);

    // rest of the code
}

答案 4 :(得分: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;
}