2016-08-17 74 views
0

我一直在尋找幾個小時,似乎無法找到我所追求的答案。如果結果是重複,我很抱歉。解析用戶輸入的兩個值

現在我的程序要求用戶輸入2個整數。例如

Prompt: 15 24 

我去後,他將其他問題,所以人都提到scanffgets。但是,每個人都需要一次輸入一個號碼,而我希望從一個輸入中輸入兩個號碼。

我的其他問題是錯誤檢查。他們是否實際輸入了一個整數或某些無效的東例如:

Prompt: Hello World 
Prompt: foo 5 
Prompt: 4 bar 
Prompt: foo 
Prompt: 

代碼:

int get_input(int* x, int* y) { 

    char* p, buf[LINE_MAX]; 
    int n1, n2; 

    printf("Prompt: "); 
    fgets(buf, sizeof(buf), stdin); 
    n1 = strtol(buf, &p, 10); 
    if (p == buf || *p != '\n') { 
     return 0; 
    } 

    n2 = strtol(buf, &p, 10); 
    if (p == buf || *p != '\n') { 
     return 0; 
    } 

    *x = n1; 
    *y = n2; 

    return 1; 
} 

int main(int argc, char** argv) { 
    int x, y; 
    if (get_input(&x, &y)) { 
     printf("Worked: %d %d\n", x, t); 
    } else { 
     printf("Invalid\n"); 
    } 
    return 0; 
} 

一些錯誤檢查的缺失,但真的很憋屈得到第二個值(如果有)。還要檢查是否有超過2個值。 很多幫助,將不勝感激。

引用這讓我這麼遠:

SO Question

strtol doc

+3

提示:'n2 = strtol(p,&p,10)'。 – zwol

+1

DV甚至沒有閱讀'scanf'的手冊頁。 – Olaf

+0

@Olaf我嘗試過'scanf',但我只能讓它工作以獲得有效的輸入。上面提到的任何無效輸入都會給我一個奇怪的輸出,我感到很困惑。另外提到的SO問題說不使用'scanf',所以我爲'fgets' @zwol做了改變,但在嘗試一些有效的時候無法使它工作。你能否詳細說明一下? –

回答

0

我最終想出了什麼,也適用於可變數量的值。

bool get_input(int count, int* ref_values) { 
    char buffer[MAX_LINE_LENGTH]; 
    char* input = fgets(buffer, sizeof(buffer), stdin); 
    char* end; 
    int i = 0; 

    if (feof(stdin)) { 
     clearerr(stdin); 
     return false; 
    } 

    for (long val = strtol(input, &end, 10); input != end && i < count; val = strtol(input, &end, 10), i++) { 
     input = end; 
     if (errno == ERANGE) { 
      errno = 0; 
      return false; 
     } 

     if (val <= INT_MIN || val >= INT_MAX) { 
      return false; 
     } 
     ref_values[i] = val; 
    } 
    return i == count && strlen(input) == 1; 
} 

int main(int argc, char** argv) { 
    while (true) { 
     int values[2] = {}; 
     printf("Enter 2 numbers: "); 
     if (get_input(2, values)) { 
      printf("You entered %d %d %d\n", values[0], values[1]); 
     } else { 
      printf("Invalid\n"); 
     } 
    } 
    return 0; 
} 
-1

一旦你有一個字符串輸入,你可以使用sscanf正常,但在最後一招參數:

int get_input(int* x, int* y) { 

    char* p, buf[LINE_MAX], buf2[LINE_MAX]; 
    int n1, n2; 

    printf("Prompt: "); 
    fgets(buf, sizeof(buf), stdin); 
    if (sscanf(buf, "%d%d%s", &n1, &n2, buf2) == 2) { 
     /* Success */ 
     *x = n1; 
     *y = n2; 
     return 1; 
    } 
    /* Failure */ 
    return 0; 
} 

說明:

第三個參數(buf2)是在第二個整數之後防止無效輸入的警戒。這個技巧是有效的,因爲你首先將輸入讀入字符串。如果您嘗試直接執行scanf("%d%d%s", ...),則會提示用戶進一步輸入,直到他提供一些非空白符號輸入buf2