在c/c++中,字符串操作不可避免,而且通常,char*或者char[]就能表示字符串,这个跟java语言有很大的差别,java中char是字符,string才是字符串,他们是完全不一样的概念。在c/c++中,虽然string也可以表示字符串,但是char*表示字符串还是更常见。

既然char*和char[]都可以表示字符串,他们之间的转换是如何的呢?另外,如果字符串中都是数字,如何将他们转换为整数或者浮点数,反过来,数字如何转字符串,这个在日常的编程中,都是必须要掌握的技巧。

先来总结一下char*与char[]的互转:

一般来说,字符串的表示可以是char*,也可以是char[],这里呢,char*字符指针,表示的虽然是一个指针,但是也是一个字符串,它表示一个以'\0'结束的字符串。char[]表示的虽是一个字符数组,但同样也是一个字符串。

他们都可以直接赋值:

char* str = "hello";   这种表示方法是有问题的,如果在vs编辑器中,它会提示"hello"是一个常量,不可修改,需要const修饰符修饰,所以最终它只能表示为const char* str="hello";

char str1[] = "hello";   这种表示法,编译器会认为它也是一个常量,并且给出了长度char str1[6]。这种表示方式,编译器不会强制我们在前面加上const修饰符。

另外,char[]这种表示方法,我们可以直接在声明的时候,就给出长度,比如:

char str[6] = "12345";

因为字符数组的最后一位需要用'\0'来填充,表示结束符,所以他的长度总是要在字符实际长度的基础上+1,这是一个永恒不变的定律。所以,在字符串拷贝的时候,我们经常见到这样的初始化表达式:

char* str1 = new char[strlen(str)+1];

而上面的char str[6] = "12345";字符串表示,之所以长度初始化为6,也就是这个原因了。这个长度,只能设置大,最少设置为刚刚好,多数情况下,我们会设置一个偏大的值,比如20、100等,如果我们不想设置,可以留空,让编译器自己来默认设置,就是如下的表示方式了:

char str[] = "hello,world.";

这样,编译器会默认将数组长度设置为13。

那么问题来了,如果我们不注意,把长度设置小了怎么办? 编译阶段就会报错。

1、  char[]  -> char*    :通过"="直接赋值

char str1[] = "hello";
char* str2 = str1;
cout<<"str1="<<str1<<"\nstr2="<<str2<<endl; 

2.1、char* -> char*   :借助strcpy()拷贝赋值

const char* str3 = "1234";
char* str4 = new char[strlen(str3)+1];
strcpy(str4,str3);
cout<<"str3="<<str3<<"\nstr4="<<str4<<endl;

2.2、char* -> char[]     :借助strcpy()拷贝赋值

const char* str5 = "helloworld";
char str6[11];
strcpy(str6,str5);
cout<<"str5="<<str5<<"\nstr6="<<str6<<endl;

通过上面的示例,我们知道,如果是char[]->char*,就是直接赋值,如果是char*->char?,就是拷贝赋值,因为无论是char*还是char[],他们都需要先指定一个数组长度进行初始化,然后进行挨个下标拷贝,也就是拷贝赋值。

其实,都是字符串,为什么这么多讲究,还有这么多区别,我也理解的不是很深入,但是通过这些例子,我自己是明白了。

接下来,我们来看看字符串转数字的办法:

1、sscanf()

//sscanf
char str7[] = "3.1415";
double num7;
sscanf(str7,"%lf",&num7);
cout<<"num7="<<num7<<endl; // 3.1415

2、strtod()

char str9[] = "24.876543E+001";
double num9;
num9 = strtod(str9,NULL);
cout<<"num9="<<num9<<endl; // 248.765

3、atof()

//atof
char str8[] = "15.6";
double num8;
num8 = atof(str8);
cout<<"num8="<<num8<<endl; // 15.6

如果字符串表示的是整数(int类型),还可以通过atoi()方法。

反过来,数字转字符串:

1、整数可以通过itoa(),c++中需要改为_itoa()

int i = 999;
char c[4];
_itoa(i,c,10);
cout << "c=" << c << endl;

再次可以看出,char[]数组长度需要指定一个合适的长度。

2、sprintf(),格式化,和sscanf()类似,这里是将数字转为字符串。

double num10 = 12.3;
char str10[5];
sprintf(str10,"%.1lf",num10);
cout << "str10=" << str10 << endl;

这里如果是浮点数转换为字符串,有个问题,就是浮点数的小数点位数和格式化的参数有很大关系,这里不能一概而论,就是sprintf(str10,"%.1lf",num10),其中"%.1lf"是格式化后一位小数,如果是"%.2lf"就是两位小数,以此类推。所以这个格式化不是一个标准的办法。

3、借助sstream的stringstream字符流工具。

double value;
stringstream ss;
string str;
value = 3.1415;
ss << value;
ss >> str;
cout << "str=" << str << endl;

个人感觉,c/c++对字符串的操作显然很谨慎,有很多讲究,而在java中,这种操作几乎是无缝对接的。只要他们本身没有大问题,转换都封装好了,Integer.parseInt(str),new String(value)。而在javascript中,这种转换就更加的直接,parseInt(),parseFloat(),数字转字符串就更加简单了,他们直接在数字前面拼接一个""就可以了,比如""+123。

以上完整代码如下所示:

#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {//=char str1[] = "hello";char* str2 = str1;cout << "str1=" << str1 << "\nstr2=" << str2 << endl;//strcpyconst char* str3 = "1234";char* str4 = new char[strlen(str3) + 1];strcpy(str4, str3);cout << "str3=" << str3 << "\nstr4=" << str4 << endl;//strcpyconst char* str5 = "helloworld";char str6[11];strcpy(str6, str5);cout << "str5=" << str5 << "\nstr6=" << str6 << endl;//sscanfchar str7[] = "3.1415";double num7;sscanf(str7, "%lf", &num7);cout << "num7=" << num7 << endl;//atofchar str8[] = "15.6";double num8;num8 = atof(str8);cout << "num8=" << num8 << endl;//strtodchar str9[] = "24.876543E+001";double num9;num9 = strtod(str9, NULL);cout << "num9=" << num9 << endl;//sprintfdouble num10 = 12.3;char str10[5];sprintf(str10,"%.1lf",num10);cout << "str10=" << str10 << endl;//ecvt/*char* str11;int dec, sign;int dig = 10;double num11 = 9.86;str11 = _ecvt(num11, dig, &dec, &sign);cout << "str11=" << str11 << endl;*/double value;stringstream ss;string str;value = 3.1415;ss << value;ss >> str;cout << "str=" << str << endl;return 0;
}

运行,打印结果如下:

我们可以确定的是,char如果表示字符串是一个以'\0'结束的字符串,长度是真实长度+1。

c++中char[]与char*的转换以及char*与数字互转相关推荐

  1. C++ 中 char[],char *,string之间转换

    char []与char *之间转换 char []转char *:直接进行赋值即可 // char[] 转char * char str[] = "lala"; char *st ...

  2. CString与string、char*的区别和转换

    我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...

  3. C/C++中输入带空格的字符串 string 转 char*

    在C和C++中,用普通的方法输入带空格的字符串时,得不到后续的数据.想要在字符串中包含空格可以使用以下方法: (1)使用正则表达式 scanf("%[^\n]]",str); // ...

  4. 转:char*, char[] ,CString, string的转换

    转:char*, char[] ,CString, string的转换 (一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准 ...

  5. Java最佳实践– Char到Byte和Byte到Char的转换

    在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 特别是,我们将重点介绍使用默认编码时如何有效地处理字符到字节和字节到字符的转换. 本文总结了两种提 ...

  6. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为八进制字符串(char [])...

    c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into octal string (char[]) in ...

  7. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为十六进制字符串(char [])...

    c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into Hexadecimal string (char ...

  8. char数组转换成字符串_将字符串转换为char数组java –将字符串转换为char

    char数组转换成字符串 Sometimes we have to convert String to the character array in java programs or convert ...

  9. 类型转换——int转换成char(截短)

    转自:http://blog.sina.com.cn/s/blog_70ec9a6f010145wr.html int a,b;  //keil c里的int,也就是16位. a=0000; b=0x ...

  10. int转换成char

    如int i=1;在程序中直接将强制将i转换成char类型char a=(char)i,会发现a并不是'1'而是'\0001',原因是在将i转换成char时,默认的会把i的值当成ASCII值,这样a的 ...

最新文章

  1. ART的安装和简单使用
  2. java程序向mysql插入中文变问号
  3. 斯特芬森迭代法(Python)
  4. 【机器学习基础】数学推导+纯Python实现机器学习算法14:Ridge岭回归
  5. Mysql物理逻辑备份概述
  6. 以最短的宕机时间升级到Oracle 10g
  7. 常量的定义与使用 1006 c#
  8. Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow
  9. nyoj 78:圈水池 【凸包入门】
  10. 使用行为树(Behavior Tree)实现游戏AI
  11. Lua解析器管理器(封装解析器通用函数(销毁解析器,垃圾清理),通过ab包加载lua文件的加载器)
  12. 零基础入门AI量化交易学习笔记
  13. HCIE大师之路——Lab讲解
  14. php测试页面打开速度,测试网站访问速度的五个方法
  15. LSD-slam算法原理
  16. Crumb -面包屑状的嵌套按钮
  17. 蓝桥杯单片机12届第二场
  18. mysql 主备切换关于虚拟ip理解
  19. 庞皓计量经济学第四版_庞皓计量经济学第4版配套题库
  20. 白鹭引擎入门教程一(Egret)

热门文章

  1. Tor出现需要控制密码的解决办法
  2. 定时关机win10_巧用任务计划程序定时关机
  3. 必备单品,FSearch
  4. phrases practice_新视野大学英语第三版第二册Book 2 Unit 4 College sweethearts教案
  5. 2020年全球及中国干细胞医疗行业发展现状及竞争情况分析,美国领先于世界,北上广领先于中国「图」
  6. java StringBuilder用法,用逗号拼接字符串 zhaoqian,sunli,zhouwu
  7. 计算机维护与维修毕业论文,计算机维修与维护毕业论文.doc
  8. 大数据可视化技术应用学习目标与复习小结
  9. BlueCoat SG设备对非标准HTTPS应用访问提示不可信任发行者证书问题解决
  10. Android实验五-组件通信2