2014-01-11 56 views
-2

我是C語言新手。在下面的代碼中,我正在檢查輸入值是否大於23或小於0,如果是,則再次詢問是否有新值,但是現在我想在檢查任何字符串值時再次詢問新的值值。如何檢查字符串C

#include <stdio.h> 

int main(void) { 
    int h; 

    printf("Value: "); 
    scanf("%d", &h); 
    while ((h < 0) || (h > 23)) { 

    printf("Value: "); 
    scanf("%d", &h); 

    } 
    printf("You pressed:%d\n", h); 

    return 0; 
} 
+2

目前還不清楚你在問什麼。 – Shoe

+0

我需要檢查輸入是否像'foo'或任何類型的字符串值比再次說value.I我的意思是我需要在此程序中轉義字符串值。我只需要整數值1至23. –

+0

您要讀取輸入,直到'h'的範圍是[[1,23]'? – user2176127

回答

5

你要麼需要使用fgets()閱讀整行,然後用sscanf()掃描線,或者你需要處理時,要求掃描一些scanf()不是願意看過去的信。

#include <stdio.h> 

enum { MIN_VALUE = 0, MAX_VALUE = 23 }; 

int main(void) 
{ 
    int h; 
    char line[4096]; 
    while (fgets(line, sizeof(line), stdin) != 0) 
    { 
     if (sscanf(line, "%d", &h) == 1 && h >= MIN_VALUE && h <= MAX_VALUE) 
     { 
      printf("You entered: %d\n", h); 
      break; 
     } 
     printf("What you entered was not a number between %d and %d\n", 
       MIN_VALUE, MAX_VALUE); 
    } 
    return 0; 
} 

如果你想在可接受值是1..23,改變MIN_VALUE爲1

注意,使用fgets()這段代碼的一個好處是,你可以報什麼電腦讀回用戶 - 代碼不這樣做,但它可以很容易。當你每行讀取多個值時,這是最有價值的。如果scanf()讀取預期的6個項目中的4個,則只有輸入行的一部分要報告給用戶。另一方面,如果sscanf()讀取預期的6個項目中的4個,則可以報告用戶輸入的整行,這通常對用戶更有意義。

還是這個,也許,但它退出的第一個非整數的數據,這是不是真的在規格:

#include <stdio.h> 

int main(void) 
{ 
    int h; 
    while (scanf("%d", &h) == 1) 
    { 
     if (h >= 0 && h <= 23) 
     { 
      printf("You entered: %d\n", h); 
      break; 
     } 
     printf("What you entered was not a number between 1 and 23\n"); 
    } 
    return 0; 
} 

或者,也許你需要狼吞虎嚥輸入行的其餘部分,當scanf()失敗:

#include <stdio.h> 

int main(void) 
{ 
    int c, h; 
    while (1) 
    { 
     switch (scanf("%d", &h)) 
     { 
     case EOF: 
      return 1; 
     case 0: 
      printf("What you entered was not a number between 1 and 23\n"); 
      while ((c = getchar()) != EOF && c != '\n') /* Gobble rest of line */ 
       ; 
      break; 
     default: /* or case 1: */ 
      if (h >= 0 && h <= 23) 
      { 
       printf("You entered: %d\n", h); 
       return 0; 
      } 
      break; 
     } 
    } 
    /*NOTREACHED*/ 
    return 0; 
} 

關於第二個想法,請使用fgets()版本;它更乾淨。

+0

小調整:op希望'h'是介於'1'和'23'之間的數字。 – user2176127

+0

@jonathan請嘗試理解我的問題,我需要檢查字符串我的意思是當任何字符串輸入時再次詢問值。 –

+0

@ user2176127:問題明確表示_greater大於23或小於0_,這意味着0..23有效。 –