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语言数据结构单链表所有接口函数的全面讲解教程,有需要朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-10-10
  • C/C++中提高查找速度的小技巧

    C/C++中提高查找速度的小技巧

    这篇文章主要给大家介绍了C/C++中提高数组中查找某个元素或者字符串中查找某个字符效率的小技巧,提高速度对我们日常开发来说还是很有用的,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 如何获取C++类成员虚函数地址的示例代码

    如何获取C++类成员虚函数地址的示例代码

    这篇文章主要给大家介绍了关于C++如何获取类成员虚函数地址的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • 浅谈c++中的异常处理机制

    浅谈c++中的异常处理机制

    C++异常处理机制通过try/catch/throw结构处理运行时错误,本文就来介绍一下c++中的异常处理机制,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • 利用Debug调试代码解决0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突问题

    利用Debug调试代码解决0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突问

    这篇文章主要介绍了利用Debug调试代码解决0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突,本文给大家分享完美解决方案,需要的朋友可以参考下
    2023-03-03
  • 嵌入式C语言轻量级程序架构内核编写

    嵌入式C语言轻量级程序架构内核编写

    这篇文章主要介绍了嵌入式C语言轻量级程序架构内核编写,文章将让大家学到轻量级程序架构的内核实现原理、轻量级程序架构的设计思想、了解单片机常用的程序架构等更多C语言轻量级程序架构相关内容,需要的朋友可以参考一下
    2022-03-03
  • C语言中的隐式函数声明

    C语言中的隐式函数声明

    在c语言里面开来还是要学习c++的编程习惯,使用函数之前一定要声明。不然,即使编译能通过,运行时也可能会出一些莫名其妙的问题。
    2016-01-01
  • C语言实现二叉链表存储

    C语言实现二叉链表存储

    这篇文章主要为大家详细介绍了C语言实现二叉链表存储的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • C++设计模式之观察者模式

    C++设计模式之观察者模式

    这篇文章主要介绍了C++设计模式之观察者模式,本文讲解了什么是观察者模式、观察者模式的UML类图、观察者模式的使用场合等内容,需要的朋友可以参考下
    2014-10-10
  • C++中的多态与多重继承实现与Java的区别

    C++中的多态与多重继承实现与Java的区别

    这篇文章主要介绍了C++中的多态与多重继承实现与Java的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论