1 最近编程一直头痛这集中类型的转化,明知都可以转却总是记不住,不断的上网查来查去,在这里小结一下。以备以后方便使用,当然有些方法可能不是最新的,或者最简单的,但是对于自己已经了解的使用起来应该方便的多:
2
3 1》string转wstring
4
5 wstring s2ws(const string& s)
6
7 {
8
9 _bstr_t t = s.c_str();
10
11 wchar_t* pwchar = (wchar_t*)t;
12
13 wstring result = pwchar;
14
15 return result;
16
17 }
18
19 2》wstring转string
20
21 string ws2s(const wstring& ws)
22
23 {
24
25 _bstr_t t = ws.c_str();
26
27 char* pchar = (char*)t;
28
29 string result = pchar;
30
31 return result;
32
33 }
34
35 3》string转cstring
36
37 a)CString.format("%s", string.c_str());
38
39
40
41 b)CString StringToCString(string str)
42
43 {
44
45 CString result;
46
47 for (int i=0;i<(int)str.length();i++)
48
49 {
50
51 result+=str[i];
52
53 }
54
55 return result;
56
57 }
58
59
60
61 4》cstring转string
62
63 a)void ConvertCString2string(CString& strSrc,std::string& strDes)
64
65 {
66
67 #ifndef UNICODE
68
69 strDes = strSrc;
70
71 #else
72 USES_CONVERSION;
73
74 strDes = W2A(strSrc.LockBuffer());
75
76 strSrc.UnlockBuffer();
77
78 #endif
79
80 }
81
82 b)
83
84 string s(CString.GetBuffer());
85
86 ReleaseBuffer();
87
88
89 GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
90
91 c)
92
93 string CStringToString(CString cstr)
94 {
95 string result(cstr.GetLength(),'e');
96 for (int i=0;i<cstr.GetLength();i++)
97 {
98 result[i]=(char)cstr[i];
99 }
100 return result;
101 }
102
103 5》string转char *
104
105 a)char *p = string.c_str();
106
107 举例:
108 string aa("aaa");
109 char *c=aa.c_str();
110 string mngName;
111 char t[200];
112 memset(t,0,200);
113 strcpy(t,mngName.c_str());
114
115 b)一个一个字符的赋值
116
117
118
119 char *p = new char[sring的长度+1];
120
121
122 p[string的长度]='/0';
123
124
125 但是要注意最后赋值'/0'!!!
126
127
128
129
130 char * StringToChar(string &str)
131
132
133 {
134
135
136 int len=str.length();
137
138
139 char * p= new char[len+1];
140
141
142 for (int i=0;i<len;i++)
143
144
145 {
146
147
148 p[i]=str[i];
149
150
151 }
152
153
154 p[len]='/0';
155
156
157 }
158
159
160 6》char* 转string
161
162 string s(char *);
163 你的只能初始化,在不是初始化的地方最好还是用assign();
164
165
166 string CharToString(char*arr,int count)
167 {
168 string result(arr,4);
169 return result;
170 }
171
172 string是ansi编码字符char
173
174
175 TCHAR是unicode编码字符wchar_t
176
177
178 7》string转TCHAR *
179
180
181 /*
182 wBuf 申明为指针即可。
183 */
184 wchar_t *chr2wch(const char *buffer)
185 {
186 size_t len = strlen(buffer);
187 size_t wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), NULL, 0);
188 wchar_t *wBuf = new wchar_t[wlen + 1];
189 MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), wBuf, int(wlen));
190 return wBuf;
191 }
192
193 8》TCHAR *转string
194
195
196 char * wch2chr(LPCTSTR lpString)
197 {
198 // Calculate unicode string length.
199 UINT len = wcslen(lpString)*2;
200 char *buf = (char *)malloc(len);
201 UINT i = wcstombs(buf,lpString,len);
202 return buf;
203 }
204
205
206 9》string 和char*转int
207
208
209 string 转 int
210 ..............................
211 char* 转 int
212 #include <stdlib.h>
213
214 int atoi(const char *nptr);
215 long atol(const char *nptr);
216 long long atoll(const char *nptr);
217 long long atoq(const char *nptr);
218
219
220 10》int转char*和string
221
222
223 在stdlib.h中有个函数itoa()
224 itoa的用法:
225 itoa(i,num,10);
226 i 需要转换成字符的数字
227 num 转换后保存字符的变量
228
229
230 11》wstring转Csting
231
232
233 std::wstring转CString
234
235
236 CString str( filename.c_str() );
237
238
239
240 12》Cstring转wstring
241
242 CString转std::wstring
243
244
245 std::wstring str = filename.GetString();
246
247
248 13》Cstring转char *
249
250
251 CString cstr(asdd);
252
253 const char* ch = (LPCTSTR)cstr;
254
255
256 举例:
257
258
259 CString str= "i am good ";
260
261 char* lp=str.GetBuffer(str.GetLength());
262
263
264 str.ReleaseBuffer();
265
266
267 14》char *转Cstring
268
269 举例:
270
271
272 CString str;
273
274 char pStr[100];
275
276
277 str.Format( "%s ",pStr);
278
279
280
281 15》TCHar转char
282
283
284 ***********************************************************************
285
286
287 * 函数: THCAR2Char
288
289
290 * 描述:将TCHAR* 转换为 char*
291
292
293 ***********************************************************************
294
295
296 char* CPublic::THCAR2char(TCHAR* tchStr)
297
298
299 {
300
301
302 int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度
303
304
305 char* chRtn = new char[iLen+1]
306
307
308 wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值
309
310
311 return chRtn;
312
313
314 }
315
316
317 16》char转tchar
318
319
320 定义了UNICODE宏之后,TCHAR就是宽字符wchar_t,否则TCHAR跟char是一样的^_
321
322
323
324 具体问题具体分析,浮云啊,一切皆是浮云.....
325
326 以下摘录自网络:
327
328 ..............................................................
329
330 《C++标准函数库》中说的
331
332 有三个函数可以将字符串的内容转换为字符数组和C—string
333
334 1.data(),返回没有”/0“的字符串数组
335
336 2,c_str(),返回有”/0“的字符串数组
337
338 3,copy()
339
340 .................................................................
341
342 int 转 CString:
343
344 CString.Format("%d",int);
345
346 ...............................
347
348 string 转 CString
349
350 CString.format("%s", string.c_str());
351
352 用c_str()确实比data()要好.
353
354 .......................................
355
356 char* 转 CString
357
358 CString.format("%s", char*);
359
360 CString strtest;
361
362 char * charpoint;
363
364 charpoint="give string a value";
365
366 strtest=charpoint; //直接付值
367
368 ...................................................................
369
370 CString 转 int
371
372 CString ss="1212.12";
373
374 int temp=atoi(ss); //atoi _atoi64或atol
375
376
377
378 将字符转换为整数,可以使用atoi、_atoi64或atol。
379
380 int int_chage = atoi((lpcstr)ss) ;
381
382 或:
383
384 CString str = "23";
385
386 UINT uint;
387
388 sscanf(str, "%d", uint);
389
390 ..............................
391
392 string 转 int
393
394 ..............................
395
396 char* 转 int
397
398 #include <stdlib.h>
399
400
401
402 int atoi(const char *nptr);
403
404 long atol(const char *nptr);
405
406 long long atoll(const char *nptr);
407
408 long long atoq(const char *nptr);
409
410 ...................................................................
411
412 CString 转 string
413
414 string s(CString.GetBuffer());
415
416 GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
417
418 ..........................................
419
420 int 转 string
421
422 ..........................................
423
424 char* 转 string
425
426 string s(char *);
427
428 你的只能初始化,在不是初始化的地方最好还是用assign().
429
430 ...................................................................
431
432 CString 转 char *
433
434 CString strtest="wwwwttttttt";
435
436 charpoint=strtest.GetBuffer(strtest.GetLength());
437
438 CString转换 char[100]
439
440 char a[100];
441
442 CString str("aaaaaa");
443
444 strncpy(a,(LPCTSTR)str,sizeof(a));
445
446 CString str="aaa";
447
448 char* ch;
449
450 ch=(char*)(LPCTSTR)str;
451
452 ..........................................
453
454 int 转 char *
455
456 在stdlib.h中有个函数itoa()
457
458 itoa的用法:
459
460 itoa(i,num,10);
461
462 i 需要转换成字符的数字
463
464 num 转换后保存字符的变量
465
466 10 转换数字的基数(进制)10就是说按照10进制转换数字。还可以是2,8,16等等你喜欢的进制类型
467
468 原形:char *itoa(int value, char* string, int radix);
469
470 实例:
471
472 #include "stdlib.h"
473
474 #include "stdio.h"
475
476 main()
477
478 {
479
480 int i=1234;
481
482 char s[5];
483
484 itoa(i,s,10);
485
486 printf("%s",s);
487
488 getchar();
489
490 }
491
492 ..........................................
493
494 string 转 char *
495
496 char *p = string.c_str();
497
498
499
500 string aa("aaa");
501
502 char *c=aa.c_str();
503
504 string mngName;
505
506 char t[200];
507
508 memset(t,0,200);
509
510 strcpy(t,mngName.c_str());
511
512 ...................................................................
513
514 标准C里没有string,char *==char []==string
515
516 可以用CString.Format("%s",char *)这个方法来将char *转成CString。要把CString转成char *,用操
517
518 作符(LPCSTR)CString就可以了。
519
520 cannot convert from 'const char *' to 'char *'
521
522 const char *c=aa.c_str();
523
524 string.c_str()只能转换成const char *
525
526
527
528
529
530
531
532
533
534
535
536
537 #include <string>
538
539 // 使用CString必须使用MFC,并且不可包含<windows.h>
540
541 #define _AFXDLL
542
543 #include <afx.h>
544
545 using namespace std;
546
547 //———————————————————————————-
548
549 //将 单字节char* 转换为 宽字节 wchar*
550
551 inline wchar_t* AnsiToUnicode( const char* szStr )
552
553 {
554
555 int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
556
557 if (nLen == 0)
558
559 {
560
561 return NULL;
562
563 }
564
565 wchar_t* pResult = new wchar_t[nLen];
566
567 MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
568
569 return pResult;
570
571 }
572
573 //———————————————————————————-
574
575 // 将 宽字节wchar_t* 转换 单字节char*
576
577 inline char* UnicodeToAnsi( const wchar_t* szStr )
578
579 {
580
581 int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
582
583 if (nLen == 0)
584
585 {
586
587 return NULL;
588
589 }
590
591 char* pResult = new char[nLen];
592
593 WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
594
595 return pResult;
596
597 }
598
599 //———————————————————————————-
600
601 // 将单字符 string 转换为宽字符 wstring
602
603 inline void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )
604
605 {
606
607 int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
608
609 wszStr.resize(nLength);
610
611 LPWSTR lpwszStr = new wchar_t[nLength];
612
613 MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
614
615 wszStr = lpwszStr;
616
617 delete [] lpwszStr;
618
619 }
620
621 //———————————————————————————-
622
623 int _tmain(int argc, _TCHAR* argv[])
624
625 {
626
627 char* pChar = “我喜欢char”;
628
629 wchar_t* pWideChar = L”我讨厌wchar_t”;
630
631 wchar_t tagWideCharList[100] ;
632
633 char ch = ‘A’;
634
635 char tagChar[100] = {NULL};
636
637 CString cStr;
638
639 std::string str;
640
641
642
643 // 注:设置语言环境以便输出WideChar
644
645 setlocale(LC_ALL,”chs”);
646
647
648
649 // 注: char* 转换 wchar_t*
650
651 // 注: wchar_t 未重载 << ,所以不可使用 cout << 输出
652
653 pWideChar = AnsiToUnicode( pChar );
654
655 // 注:printf(”%ls”) 和 wprintf(L”%s”) 一致
656
657 printf( “%ls/n”, pWideChar );
658
659
660
661 // 注:wchar_t* 转换 wchar_t[]
662
663 wcscpy ( tagWideCharList, pWideChar );
664
665 wprintf( L”%s/n”, tagWideCharList );
666
667
668
669 // 注:wchar_t[] 转换 wchar_t*
670
671 pWideChar = tagWideCharList;
672
673 wprintf( L”%s/n”, pWideChar );
674
675
676
677 // 注:char 转换 string
678
679 str.insert( str.begin(), ch );
680
681 cout << str << endl;
682
683
684
685 // 注:wchar_t* 转换 string
686
687 pWideChar = new wchar_t[str.length()];
688
689 swprintf( pWideChar, L”%s”, str.c_str());
690
691 wprintf( L”%s/n”, pWideChar );
692
693
694
695 // 注:string 转换 char*
696
697 pChar = const_cast<char*>(str.c_str());
698
699 cout << pChar << endl;
700
701
702
703 // 注:char* 转换 string
704
705 str = std::string(pChar);
706
707 // 注: cout 的 << 重载了string, 若printf 的话必须 printf(”%s”, str.c_str());
708
709 // 而不可 print( “%s”, str ); 因为 str 是个 string 类
710
711 cout << str << endl;
712
713
714
715 // 注:string 转换 char[]
716
717 str = “无聊啊无聊”;
718
719 strcpy( tagChar, str.c_str() );
720
721 printf( “%s/n”, tagChar );
722
723
724
725 // 注:string 转换 CString;
726
727 cStr = str.c_str();
728
729
730
731 // 注:CString 转换 string
732
733 str = string(cStr.GetBuffer(cStr.GetLength()));
734
735
736
737 // 注:char* 转换 CString
738
739 cStr = pChar;
740
741
742
743 // 注:CString 转换 char*
744
745 pChar = cStr.GetBuffer( cStr.GetLength() );
746
747
748
749 // 注:CString 转换 char[]
750
751 strncpy( tagChar, (LPCTSTR)CString, sizeof(tagChar));
752
753
754
755 // 注:CString 转换 wchar_t*
756
757 pWideChar = cStr.AllocSysString();
758
759 printf( “%ls/n”, pWideChar );
760
761 }