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

 更新时间:2023年08月01日 09:18:15   作者: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

总结

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

相关文章

  • C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析

    这篇文章主要介绍了C语言数据结构中二分查找递归非递归实现并分析的相关资料,需要的朋友可以参考下
    2017-03-03
  • 一文搞懂C语言static关键字的三个作用

    一文搞懂C语言static关键字的三个作用

    这篇文章主要介绍了C语言static关键字的三个作用,本文通过实例代码图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 从txt中读入数据到数组中(fscanf)的实现代码

    从txt中读入数据到数组中(fscanf)的实现代码

    下面小编就为大家带来一篇从txt中读入数据到数组中(fscanf)的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C/C++最短路径算法之迪杰斯特拉Dijkstra的实现详解

    C/C++最短路径算法之迪杰斯特拉Dijkstra的实现详解

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。本文将详解该算法的图解与实现,需要的可以参考一下
    2022-07-07
  • 基于C++实现简单日期计算器

    基于C++实现简单日期计算器

    这篇文章主要介绍了基于C++实现简单日期计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • VS2019 更新MSDN并创建快捷方式的实现

    VS2019 更新MSDN并创建快捷方式的实现

    这篇文章主要介绍了VS2019 更新MSDN并创建快捷方式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++通过循环实现猜数字小游戏

    C++通过循环实现猜数字小游戏

    这篇文章主要为大家详细介绍了C++通过循环实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C++详细讲解函数调用与Struct和CLass的区别

    C++详细讲解函数调用与Struct和CLass的区别

    主调函数使用被调函数的功能,称为函数调用。在C语言/C++中,只有在函数调用时,函数体中定义的功能才会被执行,下面让我们详细来了解
    2022-05-05
  • C++三元表达式详情

    C++三元表达式详情

    这篇文章主要介绍了C++三元表达式,文章围绕C++三元表达式的相关资料展开详细内容,需要的朋友可以参考一下,希望多你有所帮助
    2021-11-11
  • C++实现教职工信息管理系统

    C++实现教职工信息管理系统

    这篇文章主要为大家详细介绍了C++实现教职工信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论