C++中字符串的表示与转换
转换总结
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*
的转换 此文描述详尽,记于此便于查阅。
C++中字符串的表示与转换的更多相关文章
- js中字符串,数字之间转换的常用方法
var number={ num:, num1:"2你好" }; //将数字转换为字符串 var str=number.num.toString();//十进制 );//二进制 ) ...
- C和C++中字符串与数的转换
以下内容来自<C/C++程序设计实用案例教程> 1.在C语言中的转换方式 1.1数字转换为字符串 在C语言中,sprintf函数可以将任何多个数字格式化为指定格式的字符串,sprintf函 ...
- 字符串A转换到字符串B,只能一次一次转换,每次转换只能把字符串A中的一个字符全部转换成另一个字符,是否能够转换成功
public class DemoTest { public static void main(String[] args) { System.)); } /** * 有一个字符串A 有一个字符串B ...
- java中字节数组byte[]和字符(字符串)之间的转换
转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...
- Java中数据类型及其之间的转换
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
- [转]C#将image中的显示的图片转换成二进制
本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...
- 有两个地方,用到了javabean对象和属性字符串值之间的转换
1.有两个地方,用到了javabean对象和属性字符串值之间的转换 2.一个是接入层spring mvc,将json字符串参数转换为javaBean.通过@RequestBody javaBean方式 ...
- js中字符串转换为数字的方法
parseInt; parseFload; +; parseInt() 和 parseFloat() 函数会尝试逐个解析字符串中的字符,直到遇上一个无法被解析成数字的字符,然后返回该字符前所有数字字符 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
随机推荐
- Aras Innovator获取项目任务序列号
//方法名:GetProjectTasksNumber //功能描述:获取项目任务序列号 //原作者:joe //创建时间:20141225 //版权所有(C)JOE.FAN //---------- ...
- Innodb-内存架构与特性
参考文档 Innodb特性buffer_pool http://mysql.taobao.org/monthly/2017/05/01/?spm=a2c4e.11153940.blogcont2812 ...
- 第1章 分布式系统概念与ZooKeeper简介
ZooKeeper分布式专题与Dubbo微服务入门 第1章 分布式系统概念与ZooKeeper简介 1-1 zookeeper简介 1-2 什么是分布式系统 略 1-3 分布式系统的瓶颈以及zk的相关 ...
- python中的倒序遍历
1.在列表本身倒序 a = [1, 3, 7, 5, 2, 6] a.reverse() # 在列表本身进行倒序,不返回新的值 print(a) # 输出a: # [6, 2, 5, 7, 3, 1] ...
- 如何判断Office是32位还是64位?
对于持续学习VBA的老铁们,有必要了解Office的位数. 如果系统是32位的,则不需要判断Office位数了,因为只能安装32位Office. 下面只讨论64位系统中,Office的位数判断问题. ...
- [前端] VUE基础 (6) (v-router插件、获取原生DOM)
一.v-router插件 1.v-router插件介绍 v-router是vue的一个核心插件,vue+vue-router主要用来做SPA(单页面应用)的. 什么是SPA:就是在一个页面中,有多个页 ...
- IOC&AOP
- 吴裕雄--天生自然TensorFlow高层封装:Keras-RNN
# 1. 数据预处理. from keras.layers import LSTM from keras.datasets import imdb from keras.models import S ...
- 系统学习Javaweb11----综合案例1
学习内容: 1.综合案例-需求说明 2.综合案例-需求分析 3.综合案例-需求实现-网页顶部部分 4.案例-需求实现-网页导航条 5.综合案例-需求实现-网页主体部分 6.综合案例-需求实现-网页主体 ...
- mysql之DTS的那些事
最近才考虑数据库迁移,想起了之前做DTS踩过的那些坑. 基于数据库迁移,比如从源A库迁移到源B库,包括但不限于数据库上云. 数据库迁移方案有两种场景: (1).停机迁移方案 这种方案是允许停服的场景, ...