C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > c++将一个char转化为string

c++如何将一个char转化为string

作者:carbon06

这篇文章主要介绍了c++如何将一个char转化为string问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

c++将一个char转化为string

const char c = 'a';
//1.使用 string 的构造函数
string s(1,c);
//2.声明string 后将char push_back
string s1;
s1.push_back(c);
//3.使用stringstream
stringstream ss;
ss << c;
string str2 = ss.str();
//注意 使用to_string 方法会转化为char对应的ascii码
//原因是 to_string 没有接受char型参数的函数原型,有一个参数类型
//为int 的函数原型,所以传入char型字符 实际是先将char 转化
//为int 型的ascii 码,然后再转变为string
//以下输出结果为 97
cout << to_string(c) << endl;

关于C++char和string类型理解

遇到几个字符串类型的题目发现自己对概念模糊不清。

C++中char是字符类型,是一种基本数据类型,而string是一个模板类,实例化的是对象,它的内部是封装了const char*类型。

在VS2019环境下,如果char ch="abc";编译器会报错,错误提示为:const char*类型的值不能用于初始化char类型的实体。

同理,char *ch="abc";也是类似如此。

双引号应该是声明字符串,编译器默认将双引号中的内容当做一个string类型。

然而char ch=‘abc’;是合法的,是因为单引号将整个abc视为一个字符吗?当然不是。

经过测试:

char ch='abc';
cout<<ch;    //打印c

只打印一个c,很奇怪。

然而在gcc下会发出警告:

我也不是太懂,大佬给我找来了如下图:

为什么只打印一个c?

abc是一个字符串,赋值给一个字符时,会取字符串中最低的位数赋值。

关于char*和string

前面提到,string内部封装了const char*,是一个常量指针,指向可以改变,但是指向的值不能改变。

char*是一个字符型指针,可以指向一个字符数组,与string不太相同的是,字符数组存储的字符串必须以'\0'结尾,代表结束符号,而string并不一定以'\0'结束。

string的内存管理是由系统处理的,除非内存池用完,否则基本上不会出现什么内存问题。

而char*的内存需要自己手动管理了,很容易出现内存问题。

所以当你需要存一个串,但是不知道其多大时,用string更为合适。

char*和string的互相转化

如果要将string直接转换为const char*类型,可以使用两个函数。

1.c_str()

string s="abcd";
const char*ch=s.c_str();
//通过VS2019,可以看到该函数的声明为:const char*std::string::c_str()const noexcept;

c_str()函数返回一个指向正规C字符串的指针,内容与string相同,因为C本身没有string类

但是,上面这种用法很不安全,因为ch最后指向的内容是垃圾值,s对象被析构了。而且c_str()返回的是一个临时指针,不能对其进行操作。

通过strcpy函数来进行转换是安全的:

char ch[20];
string s="abcd";
strcpy(ch,s.c_str());

2.data()

string s="abcd";
const char*ch=s.data();

那c_str()和data()有什么区别呢?

c_str()会在数据的末尾添加'\0'结束符,多数用于使用字符串场合。

而data()函数不会添加'\0'结束符。

如果要转换为char*而非const char*类型

string s="abcd";
char *ch;
ch=(char*)malloc((s.length())*sizeof(char));
s.copy(ch,s.length(),0);//把当前串中以0开始的s.length()个字符拷贝到以ch为起始位置的字符数组中,返回实际拷贝的数目
cout<<ch;

通过str[i]的方式取值的类型

string s = "abcd";
	cout << typeid(s[1]).name() << endl;//char

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文