2011-11-12 41 views
1

我寫了一個代碼,它從一個.dat文件讀取一個方形矩陣,並從一個單獨的.dat文件中讀取一個向量,然後對這兩個矩陣進行增強,然後進行高斯約旦消除以將增廣矩陣變爲行減少梯隊形式。我現在正在努力使用戶友好並在用戶輸入無意義時優雅地崩潰。例如,我有一個檢查,以確保矩陣是正方形的,並且矢量的長度與矩陣的維度相匹配。我現在要做的是檢查數據文件中是否有任何字符或符號不是數字。擺脫數據文件中的字符串

我的嘗試:類似scanf("%lf", )的工作原理是當它遇到這些符號之一時停止工作。問題是我的輸入不是來自命令行。 (命令行在這裏並不是真正的選擇,因爲我希望代碼能夠接受一個巨大的矩陣,用戶不想坐在那裏並在命令行中輸入)。在遇到字符串時,fscanf("%f", )會變得很糟糕。 有沒有像scanf這樣的東西會停下來,但遇到一封信等時不會發瘋? 如果沒有,是否還有其他建議?

+0

讀到的一切作爲字符串,測試有效性和轉換...... –

+0

不要使其崩潰了!任何理智的程序都會執行錯誤檢查,如果無法正確運行,就會退出並顯示錯誤。至於你的問題,分離解析,驗證和處理可能是最乾淨的,所以如果存在解析或驗證錯誤,你可以退出。 –

+0

對於「* ...崩潰優雅... *」+1 :-)無論如何要認真,我完全同意Kerrek SB上面寫的東西!另外我想提一提'scanf()'在'*發瘋了*之後'返回'EOF',所以你可以在運行時很容易地捕捉到這個條件。 – alk

回答

1

使用fgets獲得一行到預先分配的緩衝區,然後strtoX提取一個浮點數。 (X = ffloatX = ddoubleX = ldlong double。 它的簽名是X_t strtoX(const char *nptr, char **endptr),其中X_t是相應類型(floatdouble,或long double)。

直到線的末端是達到(**endptr = '\n'),增加行指針(它被設置爲指向預分配的緩衝區,並且如果在strtoX之後不增加,則將其增加,直至爲止) 使用兩個變量,如下所示:

char *lp = buf; 
char *lp2 = buf; 
do { 
    X_t x = strtoX(lp, &lp2); 
    if (lp == lp2 && *lp != '\n') { 
     ++lp; 
     continue; 
    } 
    if (*lp2 == '\n') 
     goto read_line; 
     // do something with x 
} while (1); 

我的代碼不是很好,但它應該顯示點。

此外,strtoXX = fX = ld之前,不支持C99/POSIX 2011年

相關問題