检查输入是否为数字

时间:2015-05-10 22:40:00

标签: c

我想查看用户的输入,如果他的输入是浮点数或整数,那么接受它并对其进行一些数学运算,否则如果他的输入是字符,符号,大量数字或除了数字之外的任何其他内容他要输入另一个输入。 提示我使用数据类型float for" p.burst_time"。 但每当我输入任何输入时,程序认为它是一个错误的输入,因为检查器变为= 1,即使输入是正确的&我不知道为什么。 并提前感谢。

for(;;){    
int i,checker,point=0;
    char c[25];
    c[strlen(c)-1] = '\0';
printf("\nEnter The Process's Burst Time > 0 : ");
fgets(c, 21, stdin); //Max input is 20.
fflush(stdin);
for(i=0;i<strlen(c);i++) //strlen(c) is the size. Max is 20.
    {

       if(c[i]=='.')
            point++;
       else if(!isdigit(c[i])){
            checker=1; //Checker is 1 when input isn't a digit.
            break;
       }

    }
    printf("checker = %d\npoint = %d\n",checker,point);
    if(checker==1||point>1){
        printf("\a\aPlease enter a positive number only greater than zero.\n"); //Input has space, symbols, letters. Anything but digits.
        continue;
    }
    else
    {
        p.burst_time = atof(c); //Converting to float only if input is nothing but digits.
        if(p.burst_time<=0)
            continue;
        else
            break;
    }
   }

2 个答案:

答案 0 :(得分:1)

一些问题:

  • 您从未将检查器设置为0(仅指向),因此在第一次出错后,所有输入都将被拒绝
  • fgets为您提供\n:您应该忽略它以及初始和终端空格(' '\r\t\f,至少2先)
  • 输入流上的fflush是非标准的,因为你使用fgets是没用的
  • c[strlen(c)-1] = '\0';没有任何意义:你试图使用null来终止数组,但是strlen只给出了第一个null的位置,这个位置在一个单元化数组上是unifined行为(感谢WhozCraig注意到它):你可以c[0] = '\0';c[sizeof(c) - 1] = '\0';,但这里又没用了

我没有尝试过它,所以我不知道是否还有其他人......

答案 1 :(得分:1)

您应该使用strtod或相关函数strtof

#include<stdio.h>
#include <stdlib.h>

int main() {
    double d;
    char c[25];
    char * converted;
    for(;;){
        printf("\nEnter The Process's Burst Time > 0 : ");
        fgets(c, 21, stdin); //Max input is 20.                                                                                     
        d = strtod(c,&converted);
        if (converted == c){
            printf("Conversion unsuccesful");
        }
        else {
            printf("Converted value: %f",d);
        }
    }
}

从手册页引用:

   double strtod(const char *nptr, char **endptr);
     

如果endptr不是NULL,则指向最后一个字符的指针   转换中使用的字符存储在引用的位置   by endptr。

     

如果未执行转换,则返回零并且返回nptr的值   存储在endptr。

引用的位置

另外,我会使用getline而不是gets来避免输入流太大时出现问题。