c - 只读浮点数并拒绝整数和字符(ab,c 等),直到正确
问题描述
我正在尝试用 C (gcc) 编写代码以仅接受浮点数并拒绝整数、特殊字符、字母数字条目。
我希望它查看printf("First number: \n");
&printf("Second number: \n");
是否是带小数的浮点数,否则要求用户重新输入浮点数,因为他的第一次输入无效。
我希望在它开始计算之前发生这种情况。如果可能,我需要一个代码示例
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
float a, b, sm;
int i = 2;
printf("First number: \n");
scanf("%f", &a);
printf("Second number: \n");
scanf("%f", &b);
printf ("%.2f + %.2f = %.2f -> Summe \n", a, b, sm = a+b);
printf ("%.2f / %d = %.2f -> Mittelwert \n", sm, i, sm/i);
printf ("%.2f - %.2f = %.2f -> Differenz \n", a, b, a-b);
printf ("%.2f * %.2f = %.2f -> Produkt \n", a, b, a*b);
printf ("%.2f / %.2f = %.2f -> Division\n", a, b, a/b);
}
感谢您的时间!
解决方案
您可以使用的返回值scanf()
来检测错误的输入。(参见fscanf() 文档)。
然后你需要明确地忽略错误的输入(例如通过扫描“非换行符”同时忽略它),以便之后能够从用户那里获取更正的输入。这并不容易,请参阅最后链接的文章。
循环执行,直到满意为止。
或者(在 StackOverflow 上广泛推荐的方法)通过将整行读取fgets()
到缓冲区中,然后通过解析来确定正确性。
跳过不正确的语法,只需将下一行读入缓冲区即可。
如果正确,从缓冲区扫描。
关于该主题的有用文章:初学者远离 scanf() 指南。
推荐阅读
- visual-studio - T4 模板文件无法编译 VS2019 V16.4.5
- angular - 无法将 Angular 应用程序部署到 Spring Boot
- java - 如何通过 Graphql 模式生成 java 实体
- python - Python:无法展开列表
- c# - 如何检查变量是否为字符串
- d3.js - d3-zoom mouseup 事件解决方法
- python-3.x - 如何使代码在第一个链接之后跟随另一个链接?
- java - 如何在 Android HtmlCompat.fromHtml() 创建 Spanned 后停止 EditText 显示 javascript
- html - 无法在所选链接中保留 CSS 样式
- angular - combineLatest 仅在第一次发出数据