看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《piness (是貼心鬼>///<)》之銘言: : 開發平台(Platform): : Scientific linux : 補上g++版本gcc version 4.1.2 : 額外使用到的函數庫(Library Used): : 無 : 問題(Question): : 我想使用sscanf來parse以下的資料, : addText(43,0,"OX0OY6.72X0Y2",0.100000, 335.420000,347.900000, 1,3,0); : addText(44,0,"OX0.66OY0X2Y0",0.100000, 354.560000,335.580000, 1,3,0); : 因此我寫這樣 : sscanf( sentence, " addText(%d,0,\"OX%lfOY%lfX%dY%d\",0.100000, %lf,%lf, 1,3, ^這裡一個空白就好,一個空白的意思就是忽略所有空白字元了 : 0);\n", &layer,&next[0],&next[1],&repeat[0],&repeat[1],&index[0],&index[1]); ^這裡不用"\n",不過因為你接下來沒有要再吃東西,所以也沒差! : 然後再直接印出 : printf(" addText(%d,0,OX %f OY %f X %d Y %d,%lf,%lf);\n", : layer,next[0],next[1],repeat[0],repeat[1],index[0],index[1]); : 看結果是否正確 : 餵入的資料(Input): : addText(43,0,"OX0OY6.72X0Y2",0.100000, 335.420000,347.900000, 1,3,0); : addText(44,0,"OX0.66OY0X2Y0",0.100000, 354.560000,335.580000, 1,3,0); 問題在input ^^^ 0X2 會被你的程式以為是16進位的2, scanf的機制是:scan到錯誤就停止,所以你在下面範例裡面,後面的值都沒有被設到。 (他接下來想要找的X,在0x2的時候被當成double吃掉了) : 預期的正確結果(Expected Output): : addText(43,0,OX 0.000000 OY 6.720000 X 0 Y 2,335.420000,347.900000); : addText(44,0,OX 0.660000 OY 0.000000 X 2 Y 0,354.560000,335.580000); : 錯誤結果(Wrong Output): : addText(43,0,OX 0.000000 OY 6.720000 X 0 Y 2,335.420000,347.900000);--正確 : addText(44,0,OX 0.660000 OY 2.000000 X 0 Y 2,335.420000,347.900000);--錯誤 : 程式碼(Code):(請善用置底文網頁, 記得排版) : double min[2], max[2], next[2], index[2]; : int repeat[2]; : sscanf( sentence, " addText(%d,0,\"OX%lfOY%lfX%dY%d\",0.100000, %lf,%lf, 1,3, : 0);\n",&layer,&next[0],&next[1],&repeat[0],&repeat[1],&index[0],&index[1]); : printf(" addText(%d,0,OX %f OY %f X %d Y %d,%lf,%lf);\n", : layer,next[0],next[1],repeat[0],repeat[1],index[0],index[1]); : 補充說明(Supplement): : 其實是不只這一行錯誤,還有其他的資料sscanf也吃不進去,對這個錯誤百思不得其解, : 因此想請教各位高手不知道是否有碰過類似問題,先謝謝各位看完!! 所以我建議改成這樣: #include <stdio.h> int main(){ double min[2], max[2], next[2] , index[2]; int repeat[2]; int layer; char sentence[9999]; char tmp[999]; while(gets(sentence)){ sscanf( sentence, " \ addText(%d,0,\"OX%lfOY%[^X]X%dY%d\",0.100000, %lf,%lf, \ 1,3,0);",&layer,&next[0],tmp,&repeat[0],&repeat[1],&index[0],&index[1]);\ printf(" addText(%d,0,OX %f OY %s X %d Y %d,%lf,%lf);\n",\ layer,next[0],tmp,repeat[0],repeat[1],index[0],index[1]); } return 0; } 用%[^X]吃一個沒有X的字串,這樣就會是你要的那個數字。 你可以去看看scanf regex 會有更深入的說明:) -- I'm CAT (Combinatorics, Analysis, and Topology) About Me : http://columbia.edu/~mt2767 想找程式或數學家教,還是發包程式案件嗎? http://w.csie.org/~b95028/parttime.php -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.90.67
cutecpu:推 04/29 12:30
piness:感謝這位高手!!已順利解決~ <(. _ .)> 04/29 12:38
kittenHTH:推這個解 簡明易懂~ 04/29 15:57
※ 編輯: scan33scan33 來自: 140.112.90.67 (04/29 16:04)