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

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

如果它是double,我们应该写“Double”,如果它是一个整数,我们应该写“Integer”

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

我将如何做,示意图:

  1. 以字符串forms读取整行输入。
  2. 修剪字符串中的所有前导和尾随空格。
  3. 使用(标准库)函数将字符串解析为整数,该函数还返回成功解析的字符数。
  4. 使用(标准库)函数将字符串解析为float,它还返回成功解析的字符数。
  5. 比较两个解析。 如果整数解析管理整个字符串,那么它是一个整数。 否则,如果浮点数管理整个字符串,那么它就是浮点数。 否则,如果既没有管理,那么这是虚假的输入。

在步骤5中首先检查整数然后检查浮点数是很重要的,因为整数输入通常也可以解析为浮点数,因此整数应该优先。

  • 将输入读为字符串
  • 解析输入读取
  • 判断读取的内容是否为整数,(否则为浮点数),否则为double或者其他完全不同的东西。

更新:

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

…如果用户给定的数字是整数还是双数?
……我们应该从用户那里获得一个号码。 (scanf)……

让我们考虑各种输入:

  1. “123”,肯定是一个整数 ,但这也会解析成功的double 。 解析为整数的大部分文本也会解析为double
  2. “123.5”将解析为double,但不是整数
  3. “xyz”会失败。
  4. “1e10000”会溢出大多数,但它也是一个整数

其他考虑:

  1. 整数是数学概念而不是C类型。
  2. 像“123.1”这样的输入不可能完全解析为double
  3. 输入有数百个字符构成问题。
  4. 像“123x”这样的输入最初解析为整数,但是以尾随的'x'失败。

继续这些合理的假设。

答:输入的字符不是太多。 整数适合long long
B.溢出/下溢/倒圆不是问题。
C.如果解析为两者,则将其称为整数
D.要求意味着使用scanf() – yuk – 而不是使用fgets()

 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"; }