只读取浮点数并拒绝整数和字符(a.b,c 等)直到正确
Read only floating numbers and reject integer and characters (a.b,c etc.) until correct
我正在尝试用 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);
}
感谢您的宝贵时间!
整数将被转换为浮点数,即如果给定数字 5
那么它将被隐式转换为浮点变量的 5.0
。因此,none应该担心这一点。
使用以下程序:
#include <stdio.h>
float ask_loop(float f) {
int ret = scanf("%f", &f);
float fl = f;
if (ret != 1) { // if scanf() returns error code
printf("Error! Please input numbers correctly.\n");
fflush(stdin);
fl = ask_loop(f);
}
return fl;
}
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
float a, b, sm;
int i = 2;
printf("First number: \n");
a = ask_loop(a);
fflush(stdin);
printf("Second number: \n");
b = ask_loop(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);
}
这里我们使用了函数 ask_loop()
来验证 scanf()
是否没有 returns 退出代码。如果没有,则表示接受成功,否则再次递归。在函数的最后,它 returns 将输入的数字赋值给 main()
.
中的变量
示例输出:
First number: // --- INPUT
abc
Error! Please input numbers correctly. // --- OUTPUT
2.0
Second number: // --- INPUT
5
2.00 + 5.00 = 7.00 -> Summe // --- OUTPUT
7.00 / 2 = 3.50 -> Mittelwert
2.00 - 5.00 = -3.00 -> Differenz
2.00 * 5.00 = 10.00 -> Produkt
2.00 / 5.00 = 0.40 -> Division (5 -> 5.00)
您可以使用 scanf()
的 return 值来检测错误输入。 (参见 fscanf() documentation)。
然后你需要明确地忽略错误的输入(例如通过扫描 "non-newline" 而忽略它),以便之后能够从用户那里获得更正的输入。这并不容易,见文末链接
如此循环,直到满意为止。
或者(在 Whosebug 上广泛推荐的方法)通过 fgets()
将整行读入缓冲区,然后通过解析确定正确性。
跳过不正确的语法,只需将下一行读入缓冲区即可。
如果正确,从缓冲区扫描。
关于该主题的有用文章:beginners guide away from scanf()。
我正在尝试用 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);
}
感谢您的宝贵时间!
整数将被转换为浮点数,即如果给定数字 5
那么它将被隐式转换为浮点变量的 5.0
。因此,none应该担心这一点。
使用以下程序:
#include <stdio.h>
float ask_loop(float f) {
int ret = scanf("%f", &f);
float fl = f;
if (ret != 1) { // if scanf() returns error code
printf("Error! Please input numbers correctly.\n");
fflush(stdin);
fl = ask_loop(f);
}
return fl;
}
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
float a, b, sm;
int i = 2;
printf("First number: \n");
a = ask_loop(a);
fflush(stdin);
printf("Second number: \n");
b = ask_loop(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);
}
这里我们使用了函数 ask_loop()
来验证 scanf()
是否没有 returns 退出代码。如果没有,则表示接受成功,否则再次递归。在函数的最后,它 returns 将输入的数字赋值给 main()
.
示例输出:
First number: // --- INPUT
abc
Error! Please input numbers correctly. // --- OUTPUT
2.0
Second number: // --- INPUT
5
2.00 + 5.00 = 7.00 -> Summe // --- OUTPUT
7.00 / 2 = 3.50 -> Mittelwert
2.00 - 5.00 = -3.00 -> Differenz
2.00 * 5.00 = 10.00 -> Produkt
2.00 / 5.00 = 0.40 -> Division (5 -> 5.00)
您可以使用 scanf()
的 return 值来检测错误输入。 (参见 fscanf() documentation)。
然后你需要明确地忽略错误的输入(例如通过扫描 "non-newline" 而忽略它),以便之后能够从用户那里获得更正的输入。这并不容易,见文末链接
如此循环,直到满意为止。
或者(在 Whosebug 上广泛推荐的方法)通过 fgets()
将整行读入缓冲区,然后通过解析确定正确性。
跳过不正确的语法,只需将下一行读入缓冲区即可。
如果正确,从缓冲区扫描。
关于该主题的有用文章:beginners guide away from scanf()。