C结构数组输入

C结构数组输入,c,printf,scanf,gets,puts,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(); }

我有以下结构

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

有什么问题

谢谢

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

Book inputBook()
{
    Book myBook;

    fflush(stdin);

    // rest of the code
}
也许您可以在输入之前尝试使用fflush(stdin)

Book inputBook()
{
    Book myBook;

    fflush(stdin);

    // rest of the code
}

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

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

函数inputBook()

主要功能

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

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

    return 0;
}
int main(int argc,const char*argv[]
{    
书籍[5];

对于(int i=0;i这是因为变量myBook仅在inputBook范围内有效,并且在函数退出时立即销毁

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

函数inputBook()

主要功能

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

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

    return 0;
}
int main(int argc,const char*argv[]
{    
书籍[5];

对于(inti=0;i我认为您需要在下一次迭代之前刷新stdin。您的stdin流中有一个以前的CRLF


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

我认为您需要在下一次迭代之前刷新stdin。您的stdin流中有一个以前的CRLF

使用fflush(标准输入法);在循环开始处。

要更正,请更换:

gets(myBook.name);
与:

as
scanf()
将跳过任何空白字符,但
gets()
不会。换行符被视为空白字符,并且在输入
price
后,
stdin
中将保留一个换行符,导致
gets()
读取换行符,而实际上什么也不读取

值得一读:

要更正,请替换:

gets(myBook.name);
与:

as
scanf()
将跳过任何空白字符,但
gets()
不会。换行符被视为空白字符,并且在输入
price
后,
stdin
中将保留一个换行符,导致
gets()
读取换行符,而实际上什么也不读取

值得一读:

#包括
typedef字符字符串[256];
类型定义结构
{
字符串名;
国际年;
浮动价格;
}书;
图书输入书()
{
我的书;
//名字
放入(“输入图书名称:”);
getchar();
获取(myBook.name);
//出版年
puts(“输入图书出版年份:”);
scanf(“%i”和myBook.year);
//价格
看跌期权(“输入账面价格:”);
scanf(“%f”和myBook.price);
归还我的书;
}
int main(int argc,const char*argv[]
{
书籍[5];
int i=0;对于(i=0;i
#包括
typedef字符字符串[256];
类型定义结构
{
字符串名;
国际年;
浮动价格;
}书;
图书输入书()
{
我的书;
//名字
放入(“输入图书名称:”);
getchar();
获取(myBook.name);
//出版年
puts(“输入图书出版年份:”);
scanf(“%i”和myBook.year);
//价格
看跌期权(“输入账面价格:”);
scanf(“%f”和myBook.price);
归还我的书;
}
int main(int argc,const char*argv[]
{
书籍[5];

int i=0;for(i=0;itypedef char String[256];C code在调试时是否也会发生这种情况?我想您忘记了计算新数据的字节数。如果新数据的字节数<保留位置,它将发生在我的周围,键入错误。正确的句子将是“如果新数据的字节数>保留位置,它将发生”typedef char String[256];C代码调试时是否也会发生这种情况?我想您忘记了计算新数据的字节数。如果新数据的字节数<保留位置,它将发生在我的周围,键入错误。正确的句子是“如果新数据的字节数>保留位置,它将发生”刷新
stdin
是未定义的行为。
fflush
通常用于输出流。@PavanManjunath以避免使用fflush(stdin),您可以编写一个短func来读取stdin中的所有字节。这也解决了问题。刷新
stdin
是一种未定义的行为。
fflush
通常用于输出流。@PavanManjunath以避免使用fflush(stdin),可以编写一个短func来读取stdin中的所有字节。这也解决了问题。但是正在复制返回值,否?这是确定的()。这取决于编译器…例如,SDCC不支持此功能。但是正在复制返回值,否?这是确定的()。这取决于编译器…例如,SDCC不支持此功能。在使用fflush(stdin)时:我有一点要说明..!您也可以使用,fgetc..以及如果您使用的是gcc..在使用fflush(stdin)时,fflush可能不支持:我有点要说明..!您也可以使用,fgetc..以及如果您使用的是gcc..fLush可能不支持..但是
scanf(“%255s”,myBook.name);
不扫描多个单词。请参阅,但是
scanf(“%255s”,myBook.name);
不扫描多个单词。请参阅
#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;
}