首页 > 解决方案 > 为什么 scanf 接受“%f”格式说明符的字符?

问题描述

我正在为我的课程准备一个简单的程序,发现它scanf不像我预期的那么严格:

int main()
{
  // Define variables
  float alpha;
  float b;
  float result;

  // Get user input
  printf("Type alpha and b. Space separated float numbers only.\n");
  scanf("%f %f", &alpha, &b);
  printf("%f %f\n", alpha, b);
  return 0;
}

回报:

Type alpha and b. Space separated float numbers only.
a 0
-29768832.000000 0.000000

我在哪里可以读到它的行为?

如果既没有整数也没有浮点数,如何使用标准函数使输入严格并抛出异常?

PS 我在 Ubuntu 中使用 gcc v5。

标签: cstdio

解决方案


我正在为我的课程准备一个简单的程序,发现 scanf 没有我预期的那么严格

不,你没有。

鉴于此scanf电话:

  float alpha;
  float b;

  scanf("%f %f", &alpha, &b);

...和这个输入:

a 0

...scanf在尝试扫描浮点值并且尚未扫描任何十进制数字时遇到“a”时匹配失败。它在该点停止(并将“a”留在流中以供后续读取),并且一如既往地返回成功扫描的输入字段数(0)。

我在哪里可以读到它的行为?

您可以尝试man scanf在命令行(Linux、OSX、...)上运行该命令,或者输入与 Google 搜索相同的命令。或谷歌“scanf docs”或“scanf manual”或类似的。或者查找特定 C 库的官方手册。对于标准库函数,该标准是一个很好的参考,但是您的特定实现可能有没有在其中记录的扩展,或者有时甚至可能与标准略有不同。

如果既没有整数也没有浮点数,如何使用标准函数使输入严格并抛出异常?

C 没有例外。它在大多数情况下通过函数返回值告诉您错误,尽管某些第三方库的做法可能略有不同。但是您必须通过检查返回值并做出适当的响应来尽自己的一份力量。在这种特殊情况下,您必须避免读取 和 的alphab。因为这些变量没有被初始化并且随后没有分配任何值,所以读取它们的值会产生未定义的行为


推荐阅读