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);
与:
asscanf()
将跳过任何空白字符,但gets()
不会。换行符被视为空白字符,并且在输入price
后,stdin
中将保留一个换行符,导致gets()
读取换行符,而实际上什么也不读取
值得一读:要更正,请替换:
gets(myBook.name);
与:
asscanf()
将跳过任何空白字符,但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;
}