我有以下结构
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()
时,我可以设置一个书名,它会直接跳到年份导入。
有什么问题?
谢谢!
答案 0 :(得分:4)
要更正,请更换:
gets(myBook.name);
使用:
scanf("%255s", myBook.name); /* 255 as name is 256 chars. */
因为scanf()
会跳过任何空格字符,但gets()
则不会。换行符被视为空格字符,输入stdin
后price
会有换行符,导致gets()
读取换行符并有效读取内容。
答案 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;
}