如何知道用户给出的数字是整数还是双数?
我们在课堂上有一个问题:我们应该从用户那里得到一个数字(scanf),我们应该检查它是整数还是双数。
如果它是double,我们应该写“Double”,如果它是一个整数,我们应该写“Integer”
如何检查它是整数还是双精度? 当然我们可以使用if / else。
我将如何做,示意图:
- 以字符串forms读取整行输入。
- 修剪字符串中的所有前导和尾随空格。
- 使用(标准库)函数将字符串解析为整数,该函数还返回成功解析的字符数。
- 使用(标准库)函数将字符串解析为float,它还返回成功解析的字符数。
- 比较两个解析。 如果整数解析管理整个字符串,那么它是一个整数。 否则,如果浮点数管理整个字符串,那么它就是浮点数。 否则,如果既没有管理,那么这是虚假的输入。
在步骤5中首先检查整数然后检查浮点数是很重要的,因为整数输入通常也可以解析为浮点数,因此整数应该优先。
- 将输入读为字符串
- 解析输入读取
- 判断读取的内容是否为整数,(否则为浮点数),否则为double或者其他完全不同的东西。
更新:
这个问题确实没有完全确定。 也就是说,它没有指定可能允许的整数基数。
…如果用户给定的数字是整数还是双数?
……我们应该从用户那里获得一个号码。 (scanf)……
让我们考虑各种输入:
- “123”,肯定是一个整数 ,但这也会解析成功的
double
。 解析为整数的大部分文本也会解析为double
。 - “123.5”将解析为double,但不是整数 。
- “xyz”会失败。
- “1e10000”会溢出大多数,但它也是一个整数 。
其他考虑:
- 整数是数学概念而不是C类型。
- 像“123.1”这样的输入不可能完全解析为
double
。 - 输入有数百个字符构成问题。
- 像“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"; }