轉換總結
1.char*
轉string
:可以直接賦值。
2.char[]
轉string
:可以直接賦值。
3.char*
轉char[]
:不能直接賦值,可以循環char*
字符串逐個字符賦值,也可以使用strcpy_s
等函數。
4.string
轉char[]
:不能直接賦值,可以循環char*
字符串逐個字符賦值,也可以使用strcpy_s
等函數。
5.string
轉char*
:調用string
對象的c_str函數
或data函數
或copy函數
。
6.char[]
轉char*
:直接賦值即可。
使用時,要對源格式和目標格式進行初始化。源格式賦值為具體的內容,目標格式賦值為空。
便記
- 其他變成
string
,直接賦值。 char[]
變成其他,直接賦值。
例子 替換空格
請實現一個函數,將一個字符串中的每個空格替換成%20
。例如,當字符串為We Are Happy
,則經過替換之后的字符串為We%20Are%20Happy
。
來源:替換空格
代碼1
使用字符串的替換,最后通過strcpy(str, res)
完成對原字符串的修改,這樣代碼更簡短一些,編寫也較為方便。
class Solution {
public:
void replaceSpace(char *str,int length) {
string s(str);
int i=0;
while((i=s.find(' ', i)) > -1)
{
s.erase(i, 1);
s.insert(i, "%20");
}
//auto自動識別變量類型
auto res = s.c_str();
strcpy(str, res);
}
};
分析
此題很簡單,用python等一句便能通過。但是在C++中,關鍵在於函數所傳的參數 char *str
,這是一個指針變量,主函數中應該是一個 char str[]
類型,需要通過此函數更改實參的值。所以最直接的方法便是通過指針遍歷數組進行相應位置的修改,從而實現相關替換,也就是下面的代碼。
代碼2
這里是直接遍歷數組進行相應更改,方向是從后往前。
因為更改時針對的是原字符串(具體實參)的修改,所以,更新的部分不應該破壞原來未訪問到的部分,這里即是新的下標應一直大於舊的下標(pNew > pOld
)。這樣,通過從后往前的方法可以避免每次遇到空格都得移動未訪問部分的問題(即從前往后時的缺陷),效率也會更高些。
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str==NULL || length<0)
{
return;
}
int len=0,n=0;
for(int i=0; str[i] != '\0'; i++)
{
len++;
if(str[i] == ' ')
{
n++; //記錄空格個數
}
}
int lenNew = len + n*2; //替換后字符串長度
if(lenNew > length)
{
return;
}
int pOld = len; //原字符串的下標,這里不減1,把'\0'也加上,下面pNew同理。
int pNew = lenNew; //更新中的字符串的下標
while(pOld >= 0 && pNew > pOld) //這里pNew > pOld,新的下標應一直大於舊的下標。
{
if(str[pOld] == ' ')
{
str[pNew--] = '0';
str[pNew--] = '2';
str[pNew--] = '%';
pOld--;
}
else
{
str[pNew--] = str[pOld--];
}
}
}
};
注:要理清參數 char *str
的實參
究竟是什么。
參考
C++中string、char *
、char[]
、const char*
的轉換 此文描述詳盡,記於此便於查閱。