转换总结
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] != ' '; i++)
{
len++;
if(str[i] == ' ')
{
n++; //记录空格个数
}
}
int lenNew = len + n*2; //替换后字符串长度
if(lenNew > length)
{
return;
}
int pOld = len; //原字符串的下标,这里不减1,把' '也加上,下面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*
的转换 此文描述详尽,记于此便于查阅。