2017-06-30 41 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

相關問題