討論區快速選單
知識庫快速選單
討論區最近新進100則主題 程式設計俱樂部Facebook粉絲團 沒有人比Cloudera更了解大數據
[ 回上頁 ] [ 討論區發言規則 ]
怎麼才可能把LPCWSTR連接起來?
更改我的閱讀文章字型大小
作者 : gfedk(gfedk)
[ 貼文 40 | 人氣 0 | 評價 60 | 評價/貼文 1.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/10/22 下午 09:11:52
接收了三個LPCWSTR, in1, in2, in3

然後雖要返回一個LPCWSTR, out1

我己經試了很多種方法, 用wsprintf, swprintf, 轉型等等
全都失敗, 不是說型態不對, 就是說轉型失敗

vc++的string真的好混亂, 種類太多, 都不知哪個可以用, 哪個不可以用.

請問有甚麼方法可以連接起來呢?
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4464 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/10/23 上午 07:56:01
http://www.wretch.cc/blog/fredxxx123/6646140
take a look , :-)
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/10/23 下午 08:59:58
>我己經試了很多種方法, 用wsprintf, swprintf, 轉型等等
>全都失敗, 不是說型態不對, 就是說轉型失敗

把你所試的方法全部貼出來.


>vc++的string真的好混亂, 種類太多, 都不知哪個可以用, 哪個不可以用.

VC++ 不是程式語言, 只有程式語言才有 string 類型. 但 C 及 C++ 本身都沒有內建的 string 類型, C 語言用字元陣列來模擬, C++ 語言的 std::string 函式庫內部也是個動態配置的字元陣列. 而字元有兩種, 一個是 char 的窄字元類型, 一個是 wchar_t 的寬字元類型. 就這麼多.

LPCWSTR 不過是 const wchar_t* 的 typedef. 這是視窗 API 內部的定義. LP 指的是 '*', 表示這是個指標. W 則代表 wchar_t 這個類型. C 指的就是 const. LPCWSTR 就是 pointer to a constant wide string, 一個指向唯讀寬字串的指標.

http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc

所謂種類的變化只是 const 的有無, 指向的是 char 或 wchar_t 類型這些組合而已.


>請問有甚麼方法可以連接起來呢?

指標本身當然不能連接, 你只能連接它的內容. 如果你是用 C++, 最簡單的就是用:
  std::wstring wstr(in1);
  wstr += in2;
  wstr += in3;

在你需要用到 LPCWSTR 的地方, 就用 wstr.c_str().



作者 : gfedk(gfedk)
[ 貼文 40 | 人氣 0 | 評價 60 | 評價/貼文 1.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/10/24 上午 10:55:59
第一個不行

CString stringProjectCode;
vector<LPCWSTR> group1;
vector<LPCWSTR> group2;

     group1.push_back(L"ARCH");
for(vector<LPCWSTR>::iterator i = group1.begin(); i != group1.end(); i++)
{
for(vector<LPCWSTR>::iterator j = group2.begin(); j != group2.end(); j++)
{
swprintf(groupName, L"%s %s %s", stringProjectCode, i, j);
MessageBox(groupName);
//aaApi_CreateUserList(lplUserListId, AADMSUSRLST_ACCE, 0, groupName, stringProjectDescription);
}
     }

最後出來的像這樣的東西, LPCWSTR部份全都亂碼了
aaaaaab 浿??先?????????????????????[S????盬?? (null)







第二個則是加了這句己經不行
std::wstring groupName(i);

會出現這個
error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)' : cannot convert parameter 1 from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
1> with
1> [
1> _Elem=wchar_t,
1> _Traits=std::char_traits<wchar_t>,
1> _Ax=std::allocator<wchar_t>
1> ]
1> and
1> [
1> _Ty=LPCWSTR ,
1> _Alloc=std::allocator<LPCWSTR >
1> ]
1> and
1> [
1> _Elem=wchar_t,
1> _Traits=std::char_traits<wchar_t>,
1> _Ax=std::allocator<wchar_t>
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>Generating Code...



其他我試過的有
LPWSTR groupName= L"%s %s %s";
wsprintf(groupName, stringProjectCode, i, j);

groupName=wsprintf( L"%s %s %s", stringProjectCode, i, j);

以上轉成swprintf版本

還有幾個直接在變數前加(LPCWSTR)的方法, 忘記是怎樣的了
反正今天還是要繼續試, 有新的再補上
作者 : gfedk(gfedk)
[ 貼文 40 | 人氣 0 | 評價 60 | 評價/貼文 1.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/10/24 上午 11:32:40
參考了第一個方法, vector改用
vector<wchar_t> group1;
     vector<wstring> group1;

pusu_back(L"abc"); 時己經失敗




--------------------------------


剛剛成功了
用回第一個方法, 原來加上星號就可以了
swprintf(groupName, L"%s %s %s", stringProjectCode, *i, *j);
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/10/24 下午 09:04:35
>第一個不行
>
> CString stringProjectCode;

CString 是個 generic text 類型, 它會依據編譯期 UNICODE 的設定來決定它內部是窄或寬字元. 如果你的專案是寬字元, 你應該用 CStringW.

> vector<LPCWSTR> group1;
> vector<LPCWSTR> group2;
>
> group1.push_back(L"ARCH");
> for(vector<LPCWSTR>::iterator i = group1.begin(); i != group1.end(); i++)
> {
> for(vector<LPCWSTR>::iterator j = group2.begin(); j != group2.end(); j++)
> {
> swprintf(groupName, L"%s %s %s", stringProjectCode, i, j);

1. 你沒有貼出完整的程式碼, 'groupName' 是什麼?

2. 'i' 及 'j' 是 iterator, 你確定是這麼用?


>第二個則是加了這句己經不行
>std::wstring groupName(i);

你有去仔細的看看 std::string 建構子的說明嗎?

同時, 你這個 groupName 用在什麼地方, 像上面的 swprintf() 嗎?


>其他我試過的有
>LPWSTR groupName= L"%s %s %s";
>wsprintf(groupName, stringProjectCode, i, j);

'groupName' 指向一個唯讀的 string literal, 任何意圖去更改 string literal 的嘗試都會導致不可預期的結果.

groupName 應該指向一個足夠大的, 可讀寫的記憶體, 它的大小至少要等於 stringProjectCode的長度, 加上 *i 及 *j 所指向字串長度, 再加上所需空格的數目及終結字元.

  groupName = new wchar_t[stringProjectCode.GetLength() + wcslen(*i) + wcslen(*j) + <所需空格> + 1];

用完後要記得釋放:

  delete [] groupName;

但有更簡單的方法, 而且不止一種:
1. 用 CString 提供的 Format() 成員函式:
  CStringW groupName;
  groupName.Format(L"%s %s %s", stringProjectCode, *i, *j);

2. 用 CString 或 std::string 的 concatenate operator:
  std::wstring groupName = (LPCWSTR)(stringProjectCode + " ");
  groupName += *i;
  groupName += " ";
  gorupName += *j;

3. 用 std::wstringstream, 然後用 str().c_str() 來得到 const wchar_t*:
  std::wstringstream ss;
  ss << (LPCWSTR)stringProjectCode << L" "
    << *i << L" "
    << *j;

  ::MessageBoxW(NULL, ss.str().c_str(), "Caption", MB_OK);


>還有幾個直接在變數前加(LPCWSTR)的方法, 忘記是怎樣的了
>反正今天還是要繼續試, 有新的再補上

個人建議:

  1. 可能的話, 儘量用 C++ 標準函式庫的 string class, 最好不要跟 CString 混合來用, 以免自己搞混. 既然你用 C++, 很多 C 函式庫裡的字串函式都可以不必用, 因為你可以用 C++ 的方法來達到同樣的效果.

  2. 程式語言不能用嘗試錯誤的方法來學習. 明白原理, 才能正確的運用自如.

  3. 在使用任何函式, class 前, 去看看它的說明. 要學習正確的使用 C++ 函式, 推薦這本參考書:
    "The C++ Standard Library: A Tutorial and Reference", Nicolai M. Josuttis

 板主 : 徵求中
 > Visual C++ .NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ .NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++ .NET
1 青衫 2220 
2 Raymond 1500 
3 joe 520 
4 冷眼 350 
5 CodeWarrior 260 
6 marlon 230 
7 小朱 210 
8 windblown 200 
9 XWLin 120 
10 小約翰 120 
Visual C++ .NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125