转换总结

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*:直接赋值即可。

使用时,要对源格式和目标格式进行初始化。源格式赋值为具体的内容,目标格式赋值为空。

便记

  • 其他变成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*的转换 此文描述详尽,记于此便于查阅。

C++中字符串的表示与转换的更多相关文章

  1. js中字符串,数字之间转换的常用方法

    var number={ num:, num1:"2你好" }; //将数字转换为字符串 var str=number.num.toString();//十进制 );//二进制 ) ...

  2. C和C++中字符串与数的转换

    以下内容来自<C/C++程序设计实用案例教程> 1.在C语言中的转换方式 1.1数字转换为字符串 在C语言中,sprintf函数可以将任何多个数字格式化为指定格式的字符串,sprintf函 ...

  3. 字符串A转换到字符串B,只能一次一次转换,每次转换只能把字符串A中的一个字符全部转换成另一个字符,是否能够转换成功

    public class DemoTest { public static void main(String[] args) { System.)); } /** * 有一个字符串A 有一个字符串B ...

  4. java中字节数组byte[]和字符(字符串)之间的转换

    转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...

  5. Java中数据类型及其之间的转换

    Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...

  6. [转]C#将image中的显示的图片转换成二进制

    本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...

  7. 有两个地方,用到了javabean对象和属性字符串值之间的转换

    1.有两个地方,用到了javabean对象和属性字符串值之间的转换 2.一个是接入层spring mvc,将json字符串参数转换为javaBean.通过@RequestBody javaBean方式 ...

  8. js中字符串转换为数字的方法

    parseInt; parseFload; +; parseInt() 和 parseFloat() 函数会尝试逐个解析字符串中的字符,直到遇上一个无法被解析成数字的字符,然后返回该字符前所有数字字符 ...

  9. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

随机推荐

  1. Java Keyword Synchronized 学习记录

    Synchronized Java编程思想:每个对象都包含了一把锁(也叫作"监视器"),它自动成为对象的一部分,调用任何synchronized方法时,对象就会被锁定,不可再调用那 ...

  2. 函数返回值return

    #函数后面如果没有return系统会默认return none def ff(): print("打印return") return 15 # 函数在执行中遇到return就会停止 ...

  3. Java线程——线程之间的几点重要说明

    在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调 ...

  4. PAT A1133 Splitting A Linked List (25) [链表]

    题目 Given a singly linked list, you are supposed to rearrange its elements so that all the negative v ...

  5. LGOJ3747 六省联考2017 分手是祝愿

    这两天遇到不少这种"人类智慧题"了,感觉都是很巧妙的 Description link 现在有 \(n\) 盏灯,设每一次操作控制第 \(i\) 占灯,而改变状态的灯就是 \(i\ ...

  6. Xpath编码问题解决

    使用Xpath获取属性时,出现乱码问题,解决办法找了好多,终于解决,特将办法贴在这,供大家尝试 不要直接简单的将爬取的网页设置为utf-8, 先通过print(r.encoding)输出看看爬取的是什 ...

  7. Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之字典类型(dict)

    字典!在Python中字典是另一种可变容器模型,可以存储任意类型的对象.是Python存储数据类型的最高级(maybe). 特点:1. 字典的存储方式和其他类型数据略有不同,是通过键(key)和值(v ...

  8. Mac 终端实现快速定位命令 自动补全目录

    基于macOS oh-my-zsh 切换终端主题 incr.zsh 实现快速定位命令 自动补全目录 效果预览 步骤 1.安装 oh-my-zsh sh -c "$(curl -fsSL ht ...

  9. crontab不执行service命令

    我这里的需求是每30分钟重启一次 写成下面的格式就可以正确执行了,后面执行的命令写绝对路径 */30 * * * * /usr/bin/supervisorctl restart all

  10. Oracle不同版本中序列的注意点

    <span style="font-size:14px;">create table manager ( userid NUMBER(10), username VAR ...