C don';中的scanf字符串和printf;I don’我没有按预期工作
我正在为我的大学计算机科学课程做练习 我必须使用多个scanf和printf来获取关于一本书的数据,数据存储在一个结构中 请求数据的函数是C don';中的scanf字符串和printf;I don’我没有按预期工作,c,string,printf,scanf,C,String,Printf,Scanf,我正在为我的大学计算机科学课程做练习 我必须使用多个scanf和printf来获取关于一本书的数据,数据存储在一个结构中 请求数据的函数是 book_t addbook() { book_t book; printf("Insert ISBN: "); scanf("%s", book.isbn); printf("Insert author: "); scanf("%s", book.author); printf("Insert titl
book_t addbook() {
book_t book;
printf("Insert ISBN: ");
scanf("%s", book.isbn);
printf("Insert author: ");
scanf("%s", book.author);
printf("Insert title: ");
scanf("%s", book.title);
printf("Insert year: ");
scanf("%d", &book.year);
printf("Insert shelf: ");
scanf("%d", &book.shelf);
printf("Insert price: ");
scanf("%lf", &book.price);
return book;
}
但当我运行程序时,在控制台上我得到了:
Insert ISBN: 978-88-08-06485-1
Insert author: Author Name
Insert title: Insert year:
我写了ISBN并按了回车键,我写了作者姓名并按了回车键,我得到了接下来的两个printf,这怎么可能
感谢您的帮助。您提供作者姓名时,可能提供了作者的全名(名+姓)。C只将作者名解析为名字,由于缓冲区中有另一个字符串,因此它被用作标题名,因此不会要求您为其指定另一个字符串 以下是一份复印件: 在本例中,作者设置为“Jon”,标题设置为Doe:
scanf将一直读取,直到找到空白字符为止。就你而言:
ISBN: blabla -> scanf reads blabla
Author: Author Name -> scanf reads Author
title: -> scanf has already Name in buffer, so Name is set into title immediatly
year: -> input next.
因此,标题的输入被跳过,因为scanf已经有一个缓冲值,下次询问之前,请尝试放置一些printf并转储一些跟踪。你所教的不仅仅是提问和阅读答案。我真的认为对于面向行的输入,
fgets
通常比scanf
好得多。scanf(“%s”,book.author)代码>-->scanf(“%[^\n]”,book.author)代码>如果使用scanf,那么缓冲区大小的问题就会出现,这是一个很难处理的问题(没有简单的方法可以扫描到缓冲区的大小,然后丢弃多余的字符,如果有的话)和解决方案?只使用一个作者的名字?(“麦当娜”写了一本书,是吗?)