BCB2010的swscanf ()之某些中文字會出錯的解決方案 |
答題得分者是:aftcast
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
各位大大:
想請敎,我用BCB2010的swscanf (),大部份的字分割都ok, 但部份的字確有問題,不知要如何處理呢? 如:服,訊 [code cpp] 請在此區域輸入程式碼 // wchar_t b[80] = L"11 服務 AAA"; // wchar_t b[80] = L"22 資訊 AAA"; wchar_t b[80] = L"33 資(三) BBB"; wchar_t s1[80],s2[80],s3[80]; s1[0] = s2[0] = s3[0] = 0x00; swscanf(b,L"%s%s%s",s1,s2,s3); ShowMessage(s2); [/code] |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
buffer 要先初始化或是全填0x00(使用memset 或是zeromemory之類的)
wchar_t b[80] = {0}; wchar_t s1[80] = {0}; ..... ===================引 用 brook 文 章=================== 各位大大: 想請敎,我用BCB2010的swscanf (),大部份的字分割都ok, 但部份的字確有問題,不知要如何處理呢? 如:服,訊 [code cpp] 請在此區域輸入程式碼 // wchar_t b[80] = L"11 服務 AAA"; // wchar_t b[80] = L"22 資訊 AAA"; wchar_t b[80] = L"33 資(三) BBB"; wchar_t s1[80],s2[80],s3[80]; s1[0] = s2[0] = s3[0] = 0x00; swscanf(b,L"%s%s%s",s1,s2,s3); ShowMessage(s2); [/code]
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
抱歉,剛仔細的在研究一下你的問題,發現…
原來那麼 "服" 的十六進位是 0x0d67,而0d這個值會被切 (與空白是同義) msdn上寫 White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input 所以沒解! 改用 stringlist之類的來解吧! : )
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
非常感謝aftcast大大的熱心回覆.
不知swscanf不能分割unicode是它的bug,還是使用上的限制, 假如是bug,從bcb5到bcb2010都還不能解決,未免也說不過去. 還好wcstok還堪用,要不然就要讀整個檔案了. [code cpp] 請在此區域輸入程式碼 int MySplitWChar(const wchar_t *s,const wchar_t *format, ...) { wchar_t *p,*w; UnicodeString uu = s; int i,k=0; va_list marker; va_start( marker, format); /* Initialize variable arguments. */ k = 0; for (i = 0; i < wcslen(format); i ) if (format[i] == L'%') k ; p = va_arg( marker, wchar_t*); w = wcstok(uu.c_str(), L" ,\r\n"); for (i=0;i if (w) wcscpy(p,w); else p[0] = 0x0000; p = va_arg( marker, wchar_t*); if (w) w = wcstok(NULL, L" ,\r\n"); } va_end( marker ); /* Reset variable arguments. */ return 0; } [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |