当前位置: 首页 > news >正文

C++之string和char的使用及区别

一、概念

  • Char:在C中,char是定义一个字符,存储的是一个字符,占一个字节,如’a’,C++中char是字符类型,是一种基本数据类型;
  • String:string是一个模板类,实例化的是对象,它的内部是封装了const char*类型,是一个常量指针,指向可以改变,但是指向的值不能改变。
  • 字符串:字符串是使用’\0’终止的一维字符数组(字符串的长度为字符个数加1,’\0’也占一个长度)。在C++中,字符串有两种,一种是字符串char[],即C风格的字符串,一种是封装好的字符串类String。

二、操作函数

  • strcpy(s1,s2) 复制字符串s2到s1,s2复制到了最前面
  • strcat(s1,s2) 连接字符串s2到字符串s1的末尾
  • strlen(s1) 返回字符串s1的长度
  • strcmp(s1,s2) 比较字符串的大小,若s1=s2,返回0,若s1> s2 ,返回正数,若s1< s2,返回负数
  • strchr(s1,ch) 返回一个指针,指向s1中字符ch第一次出现的位置
  • strstr(s1,s2) 返回一个指针,指向s1中字符串s2第一次出现的位置

三、例子

1、字符串定义例子

1

2

chargreet[] ="hello";//这两行语句等价

chargreet[6] = {'h','e','l','l','o','\0'};

2、定义string及一些基本操作

1

2

3

4

5

6

string s1 ="hello";

string s2 ="world";

string s3;

s3 = s1;//复制

s3 = s1 + s2;//连接两个字符串

intlen = s3.size();//获取字符串的长度

3、string中的每一个字符,使用单引号,是char类型

1

2

3

4

5

6

7

string s ="hell0";

charch = s[0];//'h'

charch='abc';

cout<<ch;//打印c

//只打印一个c,为什么只打印一个c?

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

4、字符串输出

1

2

3

4

5

string a;

printf("%s",a);

//输出乱码,对于string这类,要用一下加.c_str()的方式,这个函数是返回字符串string的首地址,因为%s要的是char*,但是string只是字符串,要通过函数名来返回其首地址。

string a;

printf("%s",a.c_str());

四、Char和string异同

在c++中,C风格的字符串和String类的比较,可以看下面这张图

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

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

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

五、char*和string的互相转化

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

1、c_str()

1

2

string s="abcd";

constchar*ch=s.c_str();

c_str()函数返回一个指向正规C字符串的指针,内容与string相同,因为C本身没有string类。但是,上面这种用法很不安全,因为ch最后指向的内容是垃圾值,s对象被析构了。而且c_str()返回的是一个临时指针,不能对其进行操作。

2、strcpy()

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

1

2

3

charch[20];

string s="abcd";

strcpy(ch,s.c_str());

3、data()

1

2

string s="abcd";

constchar*ch=s.data();

  • 那c_str()和data()有什么区别呢?
  • c_str()会在数据的末尾添加’\0’结束符,多数用于使用字符串场合。
  • 而data()函数不会添加’\0’结束符。

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

1

2

3

4

5

string s="abcd";

char*ch;

ch=(char*)malloc((s.length())*sizeof(char));

s.copy(ch,s.length(),0);//把当前串中以0开始的s.length()个字符拷贝到以ch为起始位置的字符数组中,返回实际拷贝的数目

cout<<ch;

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

1

2

3

string s ="abcd";

cout <<typeid(s[1]).name() << endl;//char

我测试输出 c.

六、总结

以上为个人经验,希望能给大家一个参考,

http://www.jsqmd.com/news/1393264/

相关文章:

  • Markdown LaTeX公式语法全解析:从基础到实战应用
  • KVM宿主机与虚拟机文件传输方案全解析:从SCP到VirtIO-FS
  • 网盘下载加速实测:八大网盘直链一键获取,从“一夜下不完“到分钟级搞定
  • 2026上海爱格全屋定制怎么选工厂:诺凡与主流方案对比解析 - 生活动态圈
  • 128、YOLOv12核心架构深度解剖(三):R-ELAN模块替代C3k2/C2f的设计哲学与梯度流分析——手把手推导梯度传播路径并验证涨点效果
  • 快速生成 OpenCore EFI 的终极指南:OpCore-Simplify 让黑苹果配置不再劝退
  • 一个单文件搞定Windows和Office激活:我用KMS_VL_ALL_AIO的真实体验
  • OmenSuperHub实测:惠普暗影精灵卸载官方OGH之后,风扇功耗背光还能这样玩
  • reverse_markdown命令行用法详解:轻松实现文件与管道转换
  • 从0到1部署Snipe-IT:7步跑通资产全生命周期管理,IT管理员必备的免费开源方案
  • IdentityManager完全指南:现代用户与身份管理工具的终极入门
  • 2026年8月综合盘点:留学生集运避坑参考 - 品牌品鉴馆
  • 鸣潮自动化工具ok-ww完全指南:免费解放双手的后台自动战斗助手
  • ESP32-WROOM-32E-N8R2:一款自带PSRAM的经典Wi-Fi蓝牙模组
  • G-Helper 无法启动?5 个步骤一次搞定华硕笔记本控制工具启动修复
  • BRD文件查看器 OpenBoardView 实操记录:从打不开文件到找到那颗坏芯片
  • Ubuntu GRUB启动项冗余清理:原理、方法与故障排查
  • 微信聊天记录导出永久保存完整指南:WeChatMsg免费开源工具亲测笔记
  • 微信聊天记录怎么永久保存?WeChatMsg从零到一导出聊天数据并生成年度报告
  • 可编程直流电源哪家性价比高?5家头部服务供应商对比解析 - 深度智识库
  • 微信聊天记录导出不再求人:留痕WeChatMsg三种格式完整上手
  • 硬盘又红了?我用 Czkawka 一次性找回了 40GB 空间
  • 2026开封隐形车衣推荐(新车漆面防护避坑指南) - 品牌品鉴馆
  • 一张评分表看懂BI选型:15个维度的加权评估模型
  • 北航计算机推免实战:机考面试全流程复盘与备考策略
  • 大模型风口来袭!小白程序员抓住高薪机遇,收藏这份转岗指南!
  • 微信聊天记录导出与备份终极指南:用WeChatMsg把珍贵对话永久留下
  • Path of Building 中文版实战流程:一晚上配好一套流放之路BD
  • Mockito for Dart完全指南:打造高效单元测试的终极模拟库
  • 2026年邢台CNG减压撬厂家挑选指南 玖众气体等企业值得关注 - 拜了拜了