Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C don';中的scanf字符串和printf;I don’我没有按预期工作_C_String_Printf_Scanf - Fatal编程技术网

C don';中的scanf字符串和printf;I don’我没有按预期工作

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

我正在为我的大学计算机科学课程做练习

我必须使用多个scanf和printf来获取关于一本书的数据,数据存储在一个结构中

请求数据的函数是

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,那么缓冲区大小的问题就会出现,这是一个很难处理的问题(没有简单的方法可以扫描到缓冲区的大小,然后丢弃多余的字符,如果有的话)和解决方案?只使用一个作者的名字?(“麦当娜”写了一本书,是吗?)