作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] sscanf的奇怪問題@@?
時間Fri Apr 29 13:33:23 2011
※ 引述《piness (是貼心鬼>///<)》之銘言:
吃光光
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);
parsing way:
: 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]);
output method:
: 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]);
先把有用/沒用的資料區分出來, 在原字串中(去掉前後的空白):
"addText(43,0,"OX0OY6.72X0Y2",0.100000, 335.420000,347.900000, 1,3,0);"
你想要讀的資料其實只有(標背景色):
"addText(
43,0,"OX
0OY
6.72X
0Y
2",0.100000,
335.420000,
347.900000, 1,3,0);"
建議的 parsing 流程(分為兩步驟):
1. 前處理 & 驗證輸入
2. 轉換資料
在step 1至少你可以把
'('、
','、
')'、
';'等這些東西拿掉, 我個
人偏好是用空白取代掉:
"addText
43 0 OX
0OY
6.72X
0Y
2 0.100000
335.420000 347.900000 1 3 0 "
然後比對是否符合:
a. 以 "addText" 字串做起始
b. "OY" 必定在 "OX" 後面
c. ...
等等的規則, 不符合的話看你要提供什麼機制來通知使用者, 若格
式OK則可進行step 2(先把其他非數字部份濾掉):
"
43 0
0 6.72 0 2 0.100000
335.420000 347.900000 1 3 0 "
接著只要數個簡單的sscanf就可以做掉了, 更可以應付不定長度、
輸入資料不工整的問題, 想濾掉的東西也可以用外部檔案來設定,
以上.
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (04/29 13:46)
推 james732:推板主 04/29 13:53
推 bestwishes:我也喜歡這種作法 在JAVA底下尤其好做 04/29 13:57
推 xatier:推板主,這個解更棒 04/29 14:25
推 piness:謝謝版主!!又多學了一招 04/29 14:35
推 tropical72:我比較建議原本的空白先取代成 ASCII(255),看起來也是 04/29 20:53
→ tropical72:空白,再用ASCII(20)去取代沒意義的東西.再將255取回來, 04/29 20:53
→ tropical72:我常遇到的問題便是原先空白不可抹掉 04/29 20:54
→ tropical72:取回動作通常不做,因看起來都是 space XD 04/29 20:55
可是這會有signed/unsigned的問題, 請問有除了255以外的解決方案嗎?
想到用 '\t' 之類的應該也可以, 只是沒試過~
※ 編輯: loveme00835 來自: 140.121.197.115 (04/29 21:09)