首页 > 解决方案 > 只读浮点数并拒绝整数和字符(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); 





}

感谢您的时间!

标签: cfloating-pointcharfloating

解决方案


您可以使用的返回值scanf()来检测错误的输入。(参见fscanf() 文档)。

然后你需要明确地忽略错误的输入(例如通过扫描“非换行符”同时忽略它),以便之后能够从用户那里获取更正的输入。这并不容易,请参阅最后链接的文章。
循环执行,直到满意为止。

或者(在 StackOverflow 上广泛推荐的方法)通过将整行读取fgets()到缓冲区中,然后通过解析来确定正确性。
跳过不正确的语法,只需将下一行读入缓冲区即可。
如果正确,从缓冲区扫描。

关于该主题的有用文章:初学者远离 scanf() 指南


推荐阅读