C 对于循环跳过第二次和以后的扫描
我注意到只有for循环中的第一个scanf被请求,其余的跳过了scanf请求C 对于循环跳过第二次和以后的扫描,c,C,我注意到只有for循环中的第一个scanf被请求,其余的跳过了scanf请求 int main() { int c = 0; int i; struct book { char name[20]; float price; int page; }; printf("\n enter number of book to add\n "); scanf("%d", &c); s
int main()
{
int c = 0;
int i;
struct book
{
char name[20];
float price;
int page;
};
printf("\n enter number of book to add\n ");
scanf("%d", &c);
struct book b[c];
printf("\n book details \n ");
for (i = 1; i < c; i++)
{
printf("\n enter name for book %d", i);
scanf(" %c", &b[i].name);
fflush(stdin);
printf("\n enter price for book %d", i);
scanf(" %f", &b[i].price);
fflush(stdin);
printf("\n enter page for book %d", i);
scanf(" %d", &b[i].page);
}
}
intmain()
{
int c=0;
int i;
结构体的构造
{
字符名[20];
浮动价格;
整版;
};
printf(“\n输入要添加的图书编号”\n”);
scanf(“%d”、&c);
结构书b[c];
printf(“\n书籍详细信息\n”);
对于(i=1;i
输出
输入要添加的图书编号3
图书详细信息输入图书名称
输入图书1的价格
为book 1输入第页
输入书2的名称
输入第2册的价格
输入第2册的页面
这:
看起来大错特错,它只读取一个字符,这个字符作为名称没有意义,也与您的用法不匹配
你可能是说:
scanf("%19s", b[i].name);
但这也很糟糕,因为%s
将停止在空白处,并且书名可以有多个单词。最好使用fgets()
获取完整的行,然后解析它们
在依赖所有
scanf()
调用成功之前,请确保检查它们的返回值!I/O很脆弱,可能会失败。请更正以下声明:-
scanf(" %c",&b[i].name); to scanf("%19s",b[i].name);
因为这是字符串而不是字符变量。要读取字符串,您需要使用%s
,而不是%c
。我们使用%c
仅读取单个字符。比如说
char sex;
scanf(" %c",&sex);
另外,对于我们不需要提供
&
的数组,数组本身的行为就像C/C++中的指针一样。欢迎使用StackOverflow!您的问题目前似乎没有实际问题,如果您编辑它,您可能会收到更多帮助。请注意,在仅输入流中调用fflush
(如stdin
)在C规范中被明确标记为未定义的行为。有些库将其作为语言的扩展来实现,但它不可移植,也不是您真正应该做的事情..至于您的问题,请考虑您试图阅读的名称!经验法则:scanf令人困惑,学习语言时不应使用。如果你花时间学习scanf,你就不是在学习C;您正在学习scanf格式语言。scanf(“%s”,b[i].name)
缺少宽度限制,很像现在过时的get()
。如果使用了scanf()代码>@chux,太好了!谢谢你的建议。我修改了我的答案?@mch-True,把它清理干净了。
char sex;
scanf(" %c",&sex);