[問題] 可以用sscnaf來分token嗎 ??

看板C_and_CPP (C/C++)作者 (addbear22)時間15年前 (2011/01/29 12:03), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC6 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 爬文及參考 http://blog.xuite.net/tsai.oktomy/program/12104094 的說明後, 發現在 C 中可以用 fscanf(file_in, "%[^\n] ", cLineData) 讀一整行, 其中 %[^\n] 代表只讀 \n 以外的符號, 那可不可以用 sscanf 配合 %[] 的語法來完成分 token 的工作, 而不用 strtok 呢? 餵入的資料(Input): 格式如下: 1 aa bb cc dd 2 aa bb cc dd 3 aa bb cc dd 4 aa bb cc dd 預期的正確結果(Expected Output): 1 1 aa bb cc dd 1 aa bb cc dd 2 aa bb cc dd (以下恕刪) 錯誤結果(Wrong Output): 1 1 aa bb cc dd 1 1 1 (無法離開迴圈) 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char cLineData[2000], cTmp[50]; FILE *file_in; file_in = fopen(argv[1], "r"); while(fscanf(file_in, "%[^\n] ", cLineData)>0) { fprintf(stderr, "%s\n", cLineData); while(sscanf(cLineData, "%[^\t ,;]", cTmp)>0) fprintf(stderr, "%s\n", cTmp); } fclose(file_in); return 0; } 補充說明(Supplement): 為何 fscanf(file_in, "%[^\n] ", cLineData) 中,]後的那個空白一定要加呢? 加不加有何影響呢? 感謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.86.82 自問自答,但我是亂猜,不太清楚為何這樣能動,也不知程式碼能不能再精簡 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int dTmp, nLen; char cLineData[2000], cTmp[50]; FILE *file_in; file_in = fopen(argv[1], "r"); while(fscanf(file_in, "%[^\n] ", cLineData)>0) { fprintf(stderr, "%s\n", cLineData); nLen = 0; while(sscanf(cLineData+nLen, "%[\t ,;]", cTmp)>0) nLen += strlen(cTmp); while(sscanf(cLineData+nLen, "%[^\t ,;]", cTmp)>0) { fprintf(stderr, "%s\n", cTmp); nLen += strlen(cTmp); while(sscanf(cLineData+nLen, "%[\t ,;]", cTmp)>0) nLen += strlen(cTmp); } } fclose(file_in); return 0; } 老實說我目前對 scanf 系列的指令中, "%[]" 要不要在 ] 後加個空白符號很不清楚, 煩請先進指導一下 ※ 編輯: addbear22 來自: 112.104.86.82 (01/29 16:26) ※ 編輯: addbear22 來自: 112.104.86.82 (01/29 16:37)

01/29 18:17, , 1F
sscanf( start_point* , ... , ... ) 如果你的指標不往前
01/29 18:17, 1F

01/29 18:17, , 2F
就會還是從那邊開始讀
01/29 18:17, 2F

01/29 18:19, , 3F
至於空白行....看你要不要斷它是無所謂
01/29 18:19, 3F

01/29 18:21, , 4F
總之sscanf只是把裡面的內容copy轉換而已
01/29 18:21, 4F
文章代碼(AID): #1DGv5ur7 (C_and_CPP)
文章代碼(AID): #1DGv5ur7 (C_and_CPP)