c - 为什么 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。
解决方案
我正在为我的课程准备一个简单的程序,发现 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 没有例外。它在大多数情况下通过函数返回值告诉您错误,尽管某些第三方库的做法可能略有不同。但是您必须通过检查返回值并做出适当的响应来尽自己的一份力量。在这种特殊情况下,您必须避免读取 和 的alpha
值b
。因为这些变量没有被初始化并且随后没有分配任何值,所以读取它们的值会产生未定义的行为。
推荐阅读
- jenkins - 更改的环境变量未反映在 Jenkins 管道中的外壳内部
- oracle - 删除前日志触发错误,我找不到错误
- python - 理解编码为一个热向量的 DNA 序列的一维卷积
- html - 如何在 Chrome 中进行断词:打破所有工作?
- node.js - 处理 postresql 和 nodejs 查询时出错
- node.js - npm start 停止工作,但 sudo npm start 仍然有效
- python - python lambda和常规函数之间一定有区别吗?
- r - 事后自定义对比 - glmmTMB 与 poly()
- java - Java通配符泛型在方法中的返回类型
- c# - 哪个函数/模块首先在数据库中生成 .edmx 文件?