C 我如何知道用户给出的数字是整数还是双精度?

C 我如何知道用户给出的数字是整数还是双精度?,c,C,我们在课堂上有一个问题:我们应该从用户那里得到一个数字(scanf),我们应该检查它是整数还是双数 如果是double,我们应该写“double”,如果是整数,我们应该写“integer” 如何检查它是整数还是双精度?当然,我们可以使用if/else。 以字符串形式读取输入 解析读取的输入 确定读取的内容是否可以是整数(如果是浮点,则为整数),如果是双精度,则为完全不同的内容 更新: 这个问题确实没有完全确定。也就是说,它没有指定可能允许的整数基数。我将如何操作,示意图: 将整行输入作为字符

我们在课堂上有一个问题:我们应该从用户那里得到一个数字(scanf),我们应该检查它是整数还是双数

如果是double,我们应该写“double”,如果是整数,我们应该写“integer”

如何检查它是整数还是双精度?当然,我们可以使用if/else。

  • 以字符串形式读取输入
  • 解析读取的输入
  • 确定读取的内容是否可以是整数(如果是浮点,则为整数),如果是双精度,则为完全不同的内容

更新:


这个问题确实没有完全确定。也就是说,它没有指定可能允许的整数基数。

我将如何操作,示意图:

  • 将整行输入作为字符串读取
  • 修剪字符串中的所有前导和尾随空格
  • 使用(标准库)函数将字符串解析为整数,该函数还返回成功解析的字符数
  • 使用(标准库)函数以浮点形式解析字符串,该函数还返回成功解析的字符数
  • 比较这两种解析。如果整数解析管理整个字符串,那么它就是一个整数。否则,如果浮点数管理整个字符串,那么它就是浮点数。否则,如果两者都不受管理,则这是虚假输入
  • 在第5步中,首先检查整数,然后检查浮点,这一点很重要,因为整数输入通常也可以被解析为浮点,所以整数应该优先

    。。。用户给定的数字是整数还是双精度?
    ... 我们应该从用户那里得到一个号码。(scanf)

    让我们考虑各种输入:

  • “123”当然是一个整数,但这也将解析成功的
    双精度
    。许多解析为整数的文本也会解析为
    double
  • “123.5”将解析为双精度,但不是整数
  • “xyz”将同时失败
  • “1e10000”将溢出大多数
    双精度
    ,但它也是一个整数
    其他考虑:

  • 整数是一个数学概念,而不是C类型
  • 像“123.1”这样的输入不太可能精确解析为
    双精度
    
    
  • 具有数百个字符的输入会带来问题
  • 像“123x”这样的输入最初解析为一个整数,但由于后面的
    'x'
    而失败
  • 继续进行这些合理的假设

    A.输入的字符不太多。整数适用于
    long

    B.溢出/下溢/舍入不是问题。
    C.如果解析为两者,则称之为整数。
    D.要求意味着使用
    scanf()
    -yuk-而不是使用
    fgets()


    你不能
    int
    double
    是C中的类型;它们不是用户可以输入的东西。用户输入始终是字符。将数字作为字符串读取,然后对其进行分析,查看它是否包含
    e
    e
    什么是整数?字符串是一个整数吗?因为它看起来像一个,因为它不包含一些字符集,或者因为读取它的软件可以将它表示为整数类型?实际上,我只是出于好玩的原因想向上投票:)事实上,我已经,并收回了我的否决票。'Use a(标准库)函数将字符串解析为整数,以十六进制、八进制、二进制或其他基数表示?@MartinJames这当然取决于您希望所有人都接受什么作为输入,但这与更高级别的概述无关。问题表示
    scanf
    ,在这种情况下,这些函数的行为应该类似于
    scanf
    @MartinJames:好的,你说得对,问题没有指定可能允许的整数基。可能有一些…:-)我也在假设,因为这是课堂上的一个问题,有很多关于解决方案应该有多简单的隐含假设。假设它可能不需要完美,因为它不需要处理多个基数,甚至可能不需要处理指数记数法等。隐式假设会导致学生考试不及格,否则他们很容易通过。
    const char *TestInput(void) {
      char buf[100];
      if (sscanf(" %99[^\n]", buf) != 1) 
        return "No interesting input";
      char end;
      long long ll;
      if (sscanf(buf, "%lli %c", &ll, &end) == 1)
        return "Integer";
      double d;
      if (sscanf(buf, "%lf %c", &d, &end) == 1)
        return "double";
      return "neither";
    }