2015-11-01 27 views
1

我想寫程序,將從標準輸入讀取整數,並打印他們的gcd。如果兩個整數都是總數,我打印"prime"。在結束程序打印到stderr - "DONE"之前。當用戶輸入錯誤的數據時,我想打印到stderr - "ERROR"。所以我寫這個代碼:檢查輸入和stderr

#include "stdio.h" 
#include "nd.h" 
#include "nsd.h" 

int main() { 
    int in1, in2; 
    int tmp; 
    while (1) { 
     tmp = scanf("%d %d", &in1, &in2); 
     if (tmp == EOF) { 
      fprintf(stderr, "DONE\n"); 
      break; 
     } 
     if (tmp != 2) { 
      fprintf(stderr, "ERROR\n"); 
     } else if ((nd(in1) == 1) && (nd(in2) == 1)) printf("prime\n"); 
        // nd(int a) return 1 when a is prime 
       else printf("%d\n", gcd(in1, in2)); 
    } 
    return 0; 
} 

我想在"ERROR"之後繼續工作。但它不起作用,我試過在fprintf(stderr, "ERROR\n");之後加continue;,但它也不起作用。所以,我想:

- program run 
5 10 
5 
1 3 
prime 
1 0.9 
error 
// not break here! 
10 2 
2 
... 
//EOF 
DONE 
- program stop 

一切都是工作,除了"ERROR",我有這樣的:

- program run 
5 0.9 
ERROR 
ERROR 
ERROR 
ERROR 
... 
//never stop 

據我所知,在循環週期是正確的工作。我的問題是我必須改變從「我擁有的」到「我想要的」。

回答

2

scanf()在嘗試應對意外輸入時存在問題。相反,讀fgets()

char buf[100]; 
if (fgets(buf, sizeof buf, stdin) == NULL) { 
    fprintf(stderr, "DONE\n"); 
    break; 
} 
if (sscanf(buf, "%d%d", &in1, &in2) != 2) { 
    fprintf(stderr, "ERROR\n"); 
} else if ((nd(in1) == 1) && (nd(in2) == 1)) { 
    printf("prime\n"); 
} else { 
    printf("%d\n", gcd(in1, in2)); 
} 

修訂代碼查找就行了額外的文本。

// if (sscanf(buf, "%d%d", &in1, &in2) != 2) { 
// fprintf(stderr, "ERROR\n"); 
int n = 0; 
if (sscanf(buf, "%d%d %n", &in1, &in2, &n) != 2 || buf[n]) { 
    fprintf(stderr, "ERROR\n"); 
} ... 
+0

非常有幫助,謝謝。只有一個額外的問題。 輸入: '0 0,2; 0; //必須按/ n比錯誤; 錯誤;' 但必須是: '0 0,2; 錯誤;' –

+0

所以如果我輸入的是'\ n'而不是'ERROR',但是如果我輸入'2 0.2'然後'0'(0.2不是整數,所以必須是'ERROR') –

+0

@Alexey Sharov'stdin'通常是_line_緩衝的,所以你的代碼在輸入''\ n''之前什麼都看不到。所以''\ n''是必需的。你的第二條評論 - >修正答案。 – chux