【问题标题】:scanf string and printf in C don't work as expectedC 中的 scanf 字符串和 printf 不能按预期工作
【发布时间】:2014-11-24 22:03:50
【问题描述】:

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

我必须使用多个 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然后按了return,我写了Author Name然后按了return,我得到了接下来的两个printf,这怎么可能?

感谢您的帮助。

【问题讨论】:

  • 下次在询问之前尝试放置一些 printf 并转储一些跟踪。您将教的不仅仅是提问和阅读答案。
  • 对于面向行的输入,我真的认为fgets 通常比scanf 更好。
  • scanf("%s", book.author); --> scanf(" %[^\n]", book.author);
  • 如果使用 scanf,那么缓冲区大小的问题就会引起它的丑陋,这是一个很难处理的问题(没有简单的方法可以将 scanf 转换为您拥有的缓冲区大小,然后丢弃多余的字符,如果任何)

标签: c string printf scanf


【解决方案1】:

您可能在提供作者姓名时提供了其全名(名字 + 姓氏)。 C 仅将作者姓名解析为名字,并且由于缓冲区有另一个字符串,因此它用于标题名称,因此不会要求您为其提供另一个字符串。

复制如下:

在本例中,作者设置为“Jon”,标题设置为 Doe:

【讨论】:

  • 还有解决方案吗?只使用一个名字的作者? (“麦当娜”靠她写了一本书?)
【解决方案2】:

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 已经有一个缓冲值

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2012-06-17
    • 2012-03-06
    • 2019-10-24
    • 2011-05-17
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多