C++中string、char *、char[]、const char*的轉換

Curtis_發表於2019-03-18

簡述:

1) char*string:可以直接賦值。
2) char[]string:可以直接賦值。
3) char*char[]:不能直接賦值,可以迴圈char*字串逐個字元賦值,也可以使用strcpy_s等函式。
4) stringchar[]:不能直接賦值,可以迴圈char*字串逐個字元賦值,也可以使用strcpy_s等函式
5) stringchar*:呼叫string物件的c_str函式或data函式或copy函式。
6) char[]char*:直接賦值即可。

使用時,要對源格式和目標格式進行初始化源格式賦值為具體的內容,目標格式賦值為

總結如下:

 

 

A. 變成string,直接賦值。
B. char[]變成別的,直接賦值。
C. char*const char*容易,const char*char*麻煩。<const_cast><char*>(const char*);
D. stringchar*要通過const char*中轉。
E. 變成char[]。string逐個賦值,char* const char* strncpy_s()

 

1、string轉char*

 

把string轉換為char* 有3種方法:data(); c_str(); copy();

其中,data()除了返回字串內容外,不附加結束符'\0',而c_str()返回一個以‘\0’結尾的字元陣列。

1) 呼叫string的data()函式

string str = "hello";
const char* p = str.data();//加const或者用char *p=(char*)str.data();

同時有一點需要說明,這裡在devc++中編譯需要新增const,否則會報錯invalid conversion from const char*  to char *,這裡可以再前面加上const或者在等號後面給強制轉化成char*的型別。

 

2) 呼叫string的c_str()函式

string str=“world”;
const char *p = str.c_str();//同上,要加const或者等號右邊用char*
//一定要使用strcpy()函式等來操作方法c_str()返回的指標 
//比如:最好不要這樣: 
char* c; 
string s="1234"; 
c = s.c_str(); //c最後指向的內容是垃圾,因為s物件被析構,其內容被處理
               //[Error] invalid conversion from 'const char*' to 'char*' [-fpermissive] 
//應該這樣用: 
char c[20]; 
string s="1234"; 
strcpy(c,s.c_str()); 
//這樣才不會出錯,c_str()返回的是一個臨時指標,不能對其進行操作
 
//再舉個例子
//c_str() 以 char* 形式傳回 string 內含字串
//如果一個函式要求char*引數,可以使用c_str()方法: 
string s = "Hello World!";
printf("%s", s.c_str()); //輸出 "Hello World!"

 

3) 呼叫string的copy()函式

string str="hmmm";
char p[50];
str.copy(p, 5, 0);//這裡5代表複製幾個字元,0代表複製的位置,
*(p+5)=‘\0’;//注意手動加結束符!!!

 

 

2、char*轉string

 

可以直接賦值

string s;
char *p = "hello";
s = p;

 

 

3、string轉char[]

 

不可以直接賦值,可以迴圈char*字串逐個字元賦值,也可以使用strcpy_s等函式

 

 

4、char[] 轉string

 

可以直接賦值

string pp = "dagah";
char p[8];
int i;
for( i=0;i<pp.length();i++)
	p[i] = pp[i];
p[i] = '\0';
printf("%s\n",p);
cout<<p;

 

 

5、char[]轉char*

可以直接賦值

 

6、char*轉char[]

 

不能直接賦值,可以迴圈char*字串逐個字元賦值,也可以使用strcpy_s等函式。

 

 

7、程式碼實現

 

1)string轉為其他型別
① string轉const char*

#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    std::string str = "HelloWorld!"; //初始化string型別,並具體賦值
    const char* constc = nullptr;//初始化const char*型別,並賦值為空
    constc= str.c_str();             //string型別轉const char*型別
    printf_s("%s\n", str.c_str());   //列印string型別資料 .c_str()
    printf_s("%s\n", constc);        //列印const char*型別資料
    return 0;
}
② string轉char*
#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    std::string str = "HelloWorld!"; //初始化string型別,並具體賦值
    char* c = nullptr;      //初始化char*型別,並賦值為空
    const char* constc = nullptr;//初始化const char*型別,並賦值為空
    constc= str.c_str();             //string型別轉const char*型別
    c= const_cast<char*>(constc);    //const char*型別轉char*型別
    printf_s("%s\n", str.c_str());   //列印string型別資料 .c_str()
    printf_s("%s\n",c);              //列印char*型別資料
    return 0;
}

③ string轉char[]

#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    std::string str = "HelloWorld!"; //初始化string型別,並具體賦值
    char arrc[20] = {0};     //初始化char[]型別,並賦值為空
    for (int i=0; i<str.length();i++) //string型別轉char[]型別
    {
        arrc[i]=str[i];
    }
    printf_s("%s\n", str.c_str());    //列印string型別資料 .c_str()
    printf_s("%s\n", arrc);           //列印char[]型別資料
    return 0;
}

2)const char*轉為其他型別
① const char*轉string

#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    const char* constc = "Hello World!"; //初始化const char* 型別
    std::string str;               //初始化string型別
    str= constc;                   //const char*型別轉string型別
    printf_s("%s\n", constc);      //列印const char* 型別資料
    printf_s("%s\n", str.c_str()); //列印string型別資料
    return 0;
}

② const char*轉char*

#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    const char* constc = "Hello World!"; //初始化const char* 型別
    char* c = nullptr;              //初始化char*型別
    c= const_cast<char*>(constc);   //const char*型別轉char*型別
    printf_s("%s\n", constc);       //列印const char* 型別資料
    printf_s("%s\n", c);            //列印char*型別資料
    return 0;
}

③ const char*轉char[]

#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    const char* constc = "Hello World!"; //初始化const char* 型別
    char arrc[20] = { 0 };       //初始化char[]型別,並賦值為空
    strncpy_s(arrc,constc,20);   //const char*型別轉char[]型別
    printf_s("%s\n", constc);    //列印const char* 型別資料
    printf_s("%s\n", arrc);      //列印char[]型別資料
    return 0;
}

3)char*轉為其他型別
① char*轉string

int _tmain(intargc, _TCHAR* argv[])
{
    char* c = "HelloWorld!";       //初始化char* 型別,並具體賦值
    std::string str;               //初始化string型別
    str= c;                        //char*型別轉string型別
    printf_s("%s\n", c);           //列印char* 型別資料
    printf_s("%s\n", str.c_str()); //列印string型別資料
    return 0;
}
② char*轉const char*
#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    char* c = "HelloWorld!";      //初始化char* 型別,並具體賦值
    const char* constc = nullptr; //初始化const char* 型別
    constc= c;                    //char*型別轉const char* 型別
    printf_s("%s\n", c);          //列印char* 型別資料
    printf_s("%s\n", constc);     //列印const char* 型別資料
    return 0;
}

 

③ char*轉char[]

#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    char* c = "HelloWorld!";  //初始化char* 型別,並具體賦值
    char arrc[20] = { 0 };    //初始化char[] 型別,並具體賦值
    strncpy_s(arrc,c,20);     //char*型別轉char[] 型別
    printf_s("%s\n", c);      //列印char* 型別資料
    printf_s("%s\n", arrc);   //列印char[]型別資料
    return 0;
}

 


4)char[]轉為其他型別
#include "stdafx.h"
#include <iostream>
 
int _tmain(intargc, _TCHAR* argv[])
{
    char arrc[20] = "HelloWorld!";  //初始化char[] 型別,並具體賦值
    std::string str;                //初始化string
    const char* constc = nullptr;   //初始化const char*
    char*c = nullptr;               //初始化char*
 
    str= arrc;                      //char[]型別轉string型別
    constc= arrc;                   //char[]型別轉const char* 型別
    c= arrc;                        //char[]型別轉char*型別
 
    printf_s("%s\n", arrc);         //列印char[]型別資料
    printf_s("%s\n", str.c_str());  //列印string型別資料
    printf_s("%s\n", constc);       //列印const char* 型別資料
    printf_s("%s\n", c);            //列印char*型別資料
    return 0;
}

 

參考:string、const char*、 char* 、char[]相互轉換

來源:https://blog.csdn.net/hebbely/article/details/79577880 

相關文章