C++中CString string char* char 之間的字符轉(zhuǎn)換(多種方法)
首先解釋下三者的含義
CString 是一種很有用的數(shù)據(jù)類型。它們很大程度上簡(jiǎn)化了MFC中的許多操作(適用于MFC框架),使得MFC在做字符串操作的時(shí)候方便了很多。需要包含頭文件#include <afx.h>
C++是字符串,功能比較強(qiáng)大。要想使用標(biāo)準(zhǔn)C++中string類,必須要包含#include <string>// 注意是<string>,不是<string.h>,帶.h的是C語(yǔ)言中的頭文件。Char * 專門用于指以'\0'為結(jié)束的字符串.
以下方法來(lái)進(jìn)行轉(zhuǎn)換:
// CharConvert.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include<iostream>
#include<afx.h>
#include<string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//此方法適用于“多字節(jié)” 否則會(huì)出現(xiàn)'strcpy' : cannot convert parameter 2 from 'unsigned short *' to 'const char *'
/*CString str("Hello zzu");
cout<<"the CString is "<<str<<endl;
char a[100];
strcpy(a,str);
cout<<"the convert to char * is "<<a<<"(char *)"<<endl;*/
//CString 轉(zhuǎn)換成string
// CString c_str1("Hello Zhengzhou University");
//string str;
//str=c_str1.GetBuffer(0);
//c_str1.ReleaseBuffer(); //否則就沒(méi)有釋放緩沖區(qū)所占的空間
//cout<<str<<endl;
//cout<<"\n"<<c_str1<<endl;
//string 轉(zhuǎn)換成CString
/*string str1("Hello College of Information Engineering");
CString c_str2;
c_str2=str1.c_str(); //c_str():生成一個(gè)const char*指針,指向以空字符終止的數(shù)組。
cout<<"the CString is "<<c_str2<<endl;
cout<<"the string is "<<str1<<endl;*/
//string轉(zhuǎn)換成const char*
//方法一:
//string str2("Hello College of Information Engineering");
//const char * str3; //常數(shù)指針
//str3=str2.c_str();
//cout<<"string is "<<str2<<endl;
//cout<<"const char is "<<str3<<endl;
//方法二:
// /* string str("Hello College of Information Engineering");
//const char * c_str;
//c_str=str.data();
//cout<<"string is "<<str<<endl;
//cout<<"const char is"<<c_str<<endl;*/
//string 直接轉(zhuǎn)換成char*
///*string s1 = "abcdefg";
//char *data;
//int len = s1.length();
//data = (char *)malloc((len)*sizeof(char));
//s1.copy(data,len,0);
//cout<<len<<endl;
//cout<<data<<endl;*/
//string.copy()的用法
//size_t length;
// char buffer[8];
// string str("Test string......");
//
// length=str.copy(buffer,7,6); //從buffer6,往后數(shù)7個(gè),相當(dāng)于[ buffer[6], buffer[6+7] )
// buffer[length]='\0'; //加上'\0'使得buffer就到buffer[length]為止;
// cout <<"buffer contains: " << buffer <<endl;
//char * 轉(zhuǎn)換成string
//char *到string
/* char * c_str="zzu";
string str(c_str);
cout<<"the c_str "<<c_str<<endl;
cout<<"the string is"<<str<<"and length is "<<str.length()<<endl;*/
//char a[]="asd";
//cout<<strlen(a)<<endl; //為什么顯示的是3,不是有一個(gè)\0嗎
//char * 到CString
////char * c_str1="zzu";
////CString str; //可以直接轉(zhuǎn)換,因?yàn)镃String存在重載(在多字節(jié)字符集下適用)
////str.Format("%s",c_str1);
////cout<<"the c_str1 is"<<c_str1<<endl;
////cout<<"the CString is"<<str<<endl;
//方法1:使用API:WideCharToMultiByte進(jìn)行轉(zhuǎn)換(使用過(guò),有效)
//CString str= CString("This is an example!");
//int n = str.GetLength(); //按字符計(jì)算,str的長(zhǎng)度
//int len = WideCharToMultiByte(CP_ACP,0,str,n,NULL,0,NULL,NULL);//按Byte計(jì)算str長(zhǎng)度
//char *pChStr = new char[len+1];//按字節(jié)為單位
//WideCharToMultiByte(CP_ACP,0,str,n,pChStr,len,NULL,NULL);//寬字節(jié)轉(zhuǎn)換為多字節(jié)編碼
// pChStr[len] = '\0';//不要忽略末尾結(jié)束標(biāo)志
//用完了記得delete []pChStr,防止內(nèi)存泄露
return 0;
}
同時(shí)需要注意的是,我們?cè)谄匠蓪懗绦驎r(shí),最好搞清我們的編譯環(huán)境中的編碼方式,不同的編碼方式可以會(huì)導(dǎo)致一些字符轉(zhuǎn)換失敗,當(dāng)我們編程開始,就要想好在哪個(gè)編碼方式下進(jìn)行,以免最后出現(xiàn)換編碼方式了,代碼卻出現(xiàn)很多錯(cuò)誤(很讓人頭疼),比如sqlite數(shù)據(jù)庫(kù)中的中文字符亂碼問(wèn)題就是由于編碼方式和數(shù)據(jù)庫(kù)中默認(rèn)的編碼方式不一致。這點(diǎn)在我們寫程序時(shí)一定謹(jǐn)記。
MFC中char*,string和CString之間的轉(zhuǎn)換補(bǔ)充
一、 將CString類轉(zhuǎn)換成char*(LPSTR)類型
方法一,使用強(qiáng)制轉(zhuǎn)換。例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。例如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
方法三,使用CString::GetBuffer。例如:
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在這里添加使用p的代碼
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 使用完后及時(shí)釋放,以便能使用其它的CString成員函數(shù)
CString str = "ABCDEF";
char *pBuf = str,GetBuffer( 0 );
str.ReleaseBuffer();
二、 string轉(zhuǎn)char*
string 是c++標(biāo)準(zhǔn)庫(kù)里面其中一個(gè),封裝了對(duì)字符串的操作
把string轉(zhuǎn)換為char* 有3種方法:
1。data(),返回沒(méi)有”\0“的字符串?dāng)?shù)組
如:
string str="abc";
char *p=str.data();
2.c_str 返回有”\0“的字符串?dāng)?shù)組
如:string str="gdfd";
char *p=str.c_str();
3 copy
比如
string str="hello";
char p[40];
str.copy(p,5,0); //這里5,代表復(fù)制幾個(gè)字符,0代表復(fù)制的位置
*(p+5)='\0'; //要手動(dòng)加上結(jié)束符
cout < < p;
三、 字符串string轉(zhuǎn)換為其它數(shù)據(jù)類型
temp="123456";
1)短整型(int)
i = atoi(temp);
2)長(zhǎng)整型(long)
l = atol(temp);
3)浮點(diǎn)(double)
d = atof(temp);
string s; d= atof(s.c_str());
4)BSTR變量
BSTR bstrValue = ::SysAllocString(L"程序員");
...///完成對(duì)bstrValue的使用
SysFreeString(bstrValue);
5)CComBSTR變量
CComBSTR類型變量可以直接賦值
CComBSTR bstrVar1("test");
CComBSTR bstrVar2(temp);
6)_bstr_t變量
_bstr_t類型的變量可以直接賦值
_bstr_t bstrVar1("test");
_bstr_t bstrVar2(temp);
四、 Char*轉(zhuǎn)換為string
如果要把一個(gè)char 轉(zhuǎn)換成string, 可以使用 string s(char *);
五、string 轉(zhuǎn)CString
CString.format("%s", string.c_str());
六、char 轉(zhuǎn)CString
CString.format("%s", char*);
七、 CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否則就沒(méi)有釋放緩沖區(qū)所占的空間.
八、CString互轉(zhuǎn)int
將字符轉(zhuǎn)換為整數(shù),可以使用atoi、_atoi64或atol。
而將數(shù)字轉(zhuǎn)換為CString變量,可以使用CString的Format函數(shù)。如
CString s;
int i = 64;
s.Format("%d", i)
相關(guān)文章
C++中四種對(duì)象生存期和作用域以及static的用法總結(jié)分析
以下是對(duì)C++中四種對(duì)象生存期和作用域以及static的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
Opencv?視頻讀取與寫入的實(shí)現(xiàn)示例
本文將介紹如何使用OpenCV進(jìn)行視頻讀寫。通過(guò)閱讀本文,您將了解如何讀取視頻文件、處理視頻幀、寫入視頻文件等操作,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
C語(yǔ)言如何實(shí)現(xiàn)可變參數(shù)詳解
這種可變參數(shù)可以說(shuō)是C語(yǔ)言一個(gè)比較難理解的部分,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何實(shí)現(xiàn)可變參數(shù)的相關(guān)資料,需要的朋友可以參考下2021-07-07
C++定制刪除器與特殊類設(shè)計(jì)(餓漢和懶漢)
這篇文章主要給大家介紹了關(guān)于C++定制刪除器與特殊類設(shè)計(jì)的相關(guān)資料,使用餓漢模式和懶漢模式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
C語(yǔ)言中實(shí)現(xiàn)自定義數(shù)據(jù)類型的輸入輸出的方法和技巧
在 C 語(yǔ)言中,除了基本的數(shù)據(jù)類型(如整型、浮點(diǎn)型、字符型等),我們還經(jīng)常需要自定義數(shù)據(jù)類型來(lái)滿足特定的編程需求,所以本文給大家介紹了C語(yǔ)言中實(shí)現(xiàn)自定義數(shù)據(jù)類型的輸入輸出的方法和技巧,需要的朋友可以參考下2024-07-07
C++封裝靜態(tài)鏈接庫(kù)和使用的詳細(xì)步驟
這篇文章主要介紹了C++封裝靜態(tài)鏈接庫(kù)和使用,本文描述了怎么去把一個(gè)C++程序封裝成一個(gè)靜態(tài)庫(kù)并且如何去使用這些靜態(tài)庫(kù),需要的朋友可以參考下2022-08-08
C語(yǔ)言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
枚舉顧名思義就是把所有的可能性列舉出來(lái),像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間2021-11-11
C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03

