全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1544
推到 Plurk!
推到 Facebook!

BCB2010的swscanf ()之某些中文字會出錯的解決方案

答題得分者是:aftcast
brook
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-12-16 10:04:21 IP:60.251.xxx.xxx 訂閱
各位大大:
想請敎,我用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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-12-16 11:50:19 IP:122.126.xxx.xxx 訂閱
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
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-12-16 12:11:09 IP:60.251.xxx.xxx 訂閱
感謝aftcast大大的回答,我測過,問題依然存在.
bcb5也有這個function,測的結果也一樣.
編輯記錄
brook 重新編輯於 2011-12-15 21:17:39, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-12-17 01:26:53 IP:122.126.xxx.xxx 訂閱
抱歉,剛仔細的在研究一下你的問題,發現…
原來那麼 "服" 的十六進位是 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
資深會員


發表:56
回覆:321
積分:365
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-12-29 18:54:22 IP:60.251.xxx.xxx 訂閱
非常感謝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]


系統時間:2017-10-17 15:52:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!