2013-02-18 50 views
1

我正在尋找通過stdinscanf()從用戶的幾個數據點中讀取。多個輸入格式與scanf

然而,如果用戶希望指示無效數據,由*表示,這將違反預期的格式(%f%d等),並按照我的理解,導致scanf()返回一個錯誤。

我設想處理這個問題的方法是從stdin讀取輸入作爲一系列字符串,檢查它們是否爲*,然後處理這個問題。這看起來很幼稚和混亂,我想知道是否有一個更清晰的方法來實現這一點。

請注意,我的工作環境非常有限,因此POSIX /第三方解決方案不適用。 ANSI C只:(

+3

您需要將輸入讀入緩衝區並嘗試解析它一再重複,直到你成功。有很多關於這樣做的理論,通常在「編譯器」課程中介紹。如果你不想走這條路線,你可以使用'fgets'或'getline'將輸入讀入緩衝區,然後處理幾次,看看它是如何工作的,但它會變得複雜和緩慢除非只有有限數量的可能的正確解析,否則匆忙。 – dmckee 2013-02-18 20:46:51

+0

一個字:'fgets()'。 (好吧,也許兩個'strchr()'也適用。) – 2013-02-18 21:46:10

+1

不要使用'scanf'。 http://www.c-faq.com/stdio/scanfprobs.html – jamesdlin 2013-02-18 22:50:50

回答

1

總的來說,我建議fgets()輸入,但是......

有,如果你迫使使用「南」爲無效數據的用戶一個簡單的scanf()的解決方案。通過輸入「男」 (不是非數字),你解決3個問題:這個貼出的問題,如何在自己的代碼中表示無效數據,以及如何打印出的無效數據

例:閱讀每行2個數據點

#include<math.h> 
#include<stdio.h> 
#include<stdlib.h> 
... 
double f1, f2; 
int i; 
f1 = f2 = atof("NaN"); 
i = scanf("%lf %lf\n", &f1, &f2); 
if (i != 2) { 
    // Handle input error 
} 
if (isnan(f1)) { 
    // Handle invalid f1 
} 
...