【问题标题】:How should I make it so that if the user inputs something I don't want, it will trigger a message in C?我应该如何做到这一点,如果用户输入我不想要的东西,它会在 C 中触发一条消息?
【发布时间】:2014-09-12 04:09:54
【问题描述】:

我是 C 编程的新手,我目前有这个简单的代码,要求用户输入一个浮点数,并使用该值将其打印出来,但我想知道如何制作它以便它给出一个如果用户输入任何内容,但输入数字,则消息。我知道您需要使用 if 和 else 语句,但不确定参数部分使用什么......

到目前为止我的代码(在我找出如何处理非数字输入之前尚未完成代码):

#include <stdio.h>

int main()
{
    float input;
    printf("Hello please enter a float number!\n";
    scanf( "%f", &input);
}

我知道您需要使用 if 和 else 语句,但我来自 Python 背景,因此语法完全不同...寻找有关如何处理此问题的指导!请不要太高级,我正在寻找简单的东西。

编辑:

感谢大家的精彩回复!它真的帮助我了解更多未来处理此类问题的不同方法! :D

【问题讨论】:

  • 你检查scanf的返回值。它应该返回 1(扫描 1 个项目),否则有问题。
  • 它可能是特定于操作系统的。

标签: c


【解决方案1】:

虽然 doukremt 的正确之处在于您可以检查 scanf 的返回值来检测此特定错误,但 scanf 实际上只是用于快速而肮脏的解决方案,并且当您想要更健壮的行为时会出现许多故障。

我建议将整行输入读取为字符串(例如,使用fgets),然后使用strtof 或类似的函数对其进行转换,这会告诉您何时使用它的第三个参数转换失败。然后,您可以明确检查每个可能的错误情况并适当地处理它们。

【讨论】:

    【解决方案2】:

    要检查输入是否输入了类似1.2 的数字(而不是类似!acd 的其他数字),您应该使用scanf 的返回值(它返回扫描项目的数量)。

    阅读scanf(3) 的文档(一般来说,阅读您正在使用的每个函数的文档):

    These functions return the number of input items successfully matched
    and assigned, which can be fewer than provided for, or even zero in 
    the event of an early matching failure.
    
     The value EOF is returned if the end of input is reached before
     either the first successful conversion or a matching failure occurs.
    

    具体来说,您可能会编写如下代码:

    int main() {
       float input=0; // or perhaps NAN
       printf("Hello please enter a float number!\n";
       if (scanf( "%f", &input)<1) {
         perror("bad input"); exit (EXIT_FAILURE);
       }
    }
    

    当然,您可能想重复这个问题,直到得到一个浮点数。然后使用while。您可能会处理不同的无效输入(scanf 返回 0)和文件结尾或读取错误条件(scanf 返回EOF),也许:

    int main() {
      float input=0;
      int nbscan= -1;
      do {
        printf("Enter a number:\n");
        nbscan = scanf("%f", &input);
        if (nbscan==EOF) { perror("EOF from scanf"; exit(EXIT_FAILURE); }
      } while (nbscan<1);
      return 0;
     }
    

    但是,这通常意味着用户确实输入了一些输入;也许您想捕捉用户在 500 毫秒内没有输入任何内容的情况。然后,您应该操作系统特定的功能或系统调用。在 Linux 和 Posix 上,poll(2) 系统调用是相关的。

    【讨论】:

    • 我理解你的意思,但我必须为此编写的语法对我来说并不重要。到目前为止,我在想类似 while(scanf()?
    • 所以,如果输入不好,它会返回一个 0 作为值,如果是好的则返回 1。
    • scanf 在文件结束或读取错误条件下返回EOF(在Linux 上为-1)。
    • 我明白了..我必须记住这一点,因为我现在正在运行 Windows,而且我只能在学校的计算机实验室练习 linux。如有必要,我可能会在以后安装 linux..
    • Windows 可能有自己的系统调用或函数来测试在 500 毫秒内没有输入任何内容。但我根本不了解Windows。我确实建议安装 Linux 并研究免费软件的源代码。
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多