2017-06-30 27 views
0

我想制作一个程序来检查用户是否输入了有效的双数。 我知道如何使它做检查有效的整数:如果声明检查用户是否输入了有效的双数

if (scanf("%d%c", &inter, &newLine) != 2 || newLine != '\n') 

但是当它来检查double类型这是行不通的。

我想:

if (scanf("%d%c", &inter, &newLine) != 2.00 || newLine != '\n') 

和:

if (scanf("%d%c", &inter, &newLine) != 2.000000 || newLine != '\n') 

这些都不显得工作

这里是如何检查有效的整数类型的完整示例;

do { 
    num = inter % 1; 

    if (scanf("%d%c", &inter, &newLine) != 2 || newLine != '\n') { 

     printf("Invalid integer, please try again: "); 

     flushKeybord(); 
    } else { 
     x = x + 1; 
    } 
} while (x == 0); 

的功能,它的调用如果无效,仅仅是一个清除缓冲区

+4

从'scanf'的返回值是不是输入的值,但项目数成功扫描。您必须将'%lf'格式说明符用于'double'而不是'%d'。还要注意'2.00'与'2.000000'完全相同。更多的零并不意味着“更努力”! –

+0

如果用户输入'“123 \ n”'或'“123 \ n”'或'“1.0e1000 \ n”'?那些有效? – chux

+0

是的,如果用户输入123 \ n,这将是无效的,因为它不是一个双重类型与123 \ n相同,如果用户输入1.0e1000也是无效的,因为用户输入的字符不是'\ n' –

回答

1

另一个scanf线程。不要使用scanf这一点,阅读fgets线,然后用sscanfstrtok等对其进行分析见Why does everyone say not to use scanf? What should I use instead?

此外,scanf返回匹配和分配成功输入项目的数量。

//编辑:使用strtod这样的事情:

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


int main(void) 
{ 
    char line[1024]; 
    double d; 
    char *pEnd; 

    for(;;) 
    { 
     // here you should check if fgets returns NULL 
     fgets(line, sizeof line, stdin); 

     int len = strlen(line); 

     if(line[len-1] == '\n') 
      line[len-1] = 0; 

     d = strtod(line, &pEnd);  

     if(*pEnd == 0 && len > 0) 
     { 
      printf("Double: %lf\n", d); 
      return 0; 
     } 

     printf("Wrong format, try again\n"); 
    } 

    return 0; 
} 
+0

这就是对。我通常删除'\ n'并拖曳空格,然后通过'strtod'运行输入,然后检查'* pEnd == 0'。我没有这样做,以保持代码简单。我将修复它 – Pablo

+0

详细信息:'if(line [len-1] =='\ n')'更适合于if(len> 0 && line [len-1] =='\ n')'或使用'line [strcspn(line,“\ n”)] = 0;'来处理'fgets()'_reading_一个初始的空字符。 – chux

相关问题