作者scan33scan33 (亨利喵)
看板C_and_CPP
標題Re: [問題] sscanf的奇怪問題@@?
時間Fri Apr 29 12:17:43 2011
※ 引述《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)