【问题标题】:Using scanf for question, allow user to skip question使用 scanf 提问,允许用户跳过问题
【发布时间】:2011-10-22 00:27:27
【问题描述】:

我正在为 C 编程课程做一个期末项目。该项目是创建一个数据库来存储药物信息。我已经完成了所有元素,现在可以对所有内容进行微调了。

项目中要求用户可以更改药品信息的功能。在要求中,用户应该能够通过按回车键跳过一个字段。例如,用户可以更改药品的生产商和数量。如果用户不想更改生产者,他们会按 Enter 键并移动到数量上。

我浏览了互联网,并能够让用户跳过为生产者输入字符串。但是,我无法使用整数。

这是我使用的,以便用户可以跳过输入字符串:

scanf("%30[^\n]", fentry[found].producer);

为了清楚起见,fentry.producer 是一个 30 个字符的字符串,found 是一个整数变量。

我尝试用整数输入做类似的事情(编辑:整数输入,我的意思是输入数量,而不是“找到”变量)。它会让你跳过输入一些东西,但如果你输入了一些东西,它会存储一个随机值。

有人知道怎么做吗?

【问题讨论】:

    标签: c input integer enter


    【解决方案1】:

    除了使用scanf(),从用户那里获得交互式输入的更好方法是使用fgets()。此函数获取用户按 Enter 之前的完整输入行,并将其返回以便您可以解析它。

    然后,如果您愿意,您可以使用sscanf() 来读取信息。 sscanf() 的工作方式几乎与 scanf() 完全相同,只是它从字符串而不是标准输入中读取数据。

    【讨论】:

    • 感谢您的帮助,我解决了我原来的问题。与我偶然发现的相比,我的编程课程非常基础,所以我以前从未使用过 fgets() 或 sscanf()。有没有办法接受空格和其他所有内容?
    • 我不确定您所说的“允许”是什么意思。 fgets() 函数准确返回用户键入的内容、空格和所有内容,直到用户按下 Enter 的换行符。您可以直接使用该字符串(即无需使用sscanf() 从字符串中获取字符串),也可以查看字符串内部以获取多个数据项(例如,两个一行数字)。
    • 听起来您正在使用sscanf() 从字符串中获取字符串。当您在sscanf() 中使用%s 格式说明符时,它会在遇到第一个空格时停止扫描。这就是为什么你只能得到一个字。在这种情况下,答案是根本不使用sccanf(),因为fgets() 本身就为您提供了一个完整的字符串。您可能需要做的就是从末尾删除换行符 ('\n')。
    • 您的解决方案根本不起作用,如果用户在您的 fgets(10chararray,10,stdin) 中放入 10 个带有 '\n' 的字符,您需要额外的代码来处理这个问题(清除输入缓冲区,提取'\n' 来自您的输入数组,...)。 *scanf with "%s" (或者更好的 "%9s") 在 '\n' 上中断 EVER,你不需要额外的代码来处理这个。
    【解决方案2】:

    你有没有在scanf之前把整数初始化为0?

    【讨论】:

      【解决方案3】:

      这个怎么样?

      char s[50];
      fgets(s, 50, stdin);
      
      if(s[0] != '\n') {
          fentry[found].producer = atoi(s);
      }
      

      您必须从 s 中删除所有空格。

      【讨论】:

        【解决方案4】:
        scanf("%29s", fentry[found].producer); while('\n'!=getchar());
        

        这完全有效,严格符合 ANSI C,最大。便携的。 输入缓冲区已清除,支持 chararray-length,chararray 包含(终止)'\0'(无需初始化),并且您的数组从不包含来自用户输入的 '\n'。

        【讨论】:

          【解决方案5】:

          我怀疑键盘缓冲区导致您的代码出现问题。第一次调用代码时,它将读取最多 30 个字符 - 只要它们不是 NEWLINE 字符。他们将在阅读 NEWLINE 时终止。 NEWLINE 将保留在缓冲区中。

          但是...如果您再次以相同的方式调用 scanf,则上一次调用的 NEWLINE 仍将位于键盘缓冲区中。这将在从键盘请求更多输入之前读取。 NEWLINE 将立即使 scanf 模式失败,char 数组将不会被更新,并且您将被留给指向未初始化内存区域的 char 指针。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-12
            • 2019-07-07
            • 1970-01-01
            相关资源
            最近更新 更多