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

 更新时间:2026年03月31日 14:24:56   作者:zbliquan  
文章主要介绍了C++中字符(char)、字符串(string)和字符串(char[])的区别,以及字符串的相关操作函数,如strcpy、strcat、strlen等,同时,文章还讨论了char和string异同,以及char*和string互相转化的方法

一、概念

  • 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、字符串定义例子

char greet[] = "hello";//这两行语句等价
char greet[6] = {'h','e','l','l','o','\0'};

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

string s1 = "hello";
string s2 = "world";
string s3;
s3 = s1;//复制
s3 = s1 + s2;//连接两个字符串
int len = s3.size();//获取字符串的长度

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

string s = "hell0";
char ch = s[0]; //'h'

char ch='abc';
cout<<ch; //打印c
//只打印一个c,为什么只打印一个c?
//abc是一个字符串,赋值给一个字符时,会取字符串中最低的位数赋值。

4、字符串输出

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()

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

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

2、strcpy()

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

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

3、data()

string s="abcd";
const char*ch=s.data();
  • 那c_str()和data()有什么区别呢?
  • c_str()会在数据的末尾添加’\0’结束符,多数用于使用字符串场合。
  • 而data()函数不会添加’\0’结束符。

4、如果要转换为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;

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

string s = "abcd";
cout << typeid(s[1]).name() << endl; //char
我测试输出  c.

六、总结

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

相关文章

  • C++中new和delete的介绍

    C++中new和delete的介绍

    今天小编就为大家分享一篇关于C++中new和delete的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言中sscanf()函数的字符串格式化用法

    C语言中sscanf()函数的字符串格式化用法

    这篇文章介绍的是C语言中sscanf()函数,本文介绍了sscanf()函数的含义与用法,对大家日常使用C语言的sscanf()函数很有帮助,有需要的可以参考借鉴。
    2016-08-08
  • c++通过引用实现三个数字求最大值

    c++通过引用实现三个数字求最大值

    下面我们将通过这个例子来说明引用的作为函数参数的使用方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C语言中if语句加大括号和不加大括号的区别介绍

    C语言中if语句加大括号和不加大括号的区别介绍

    这篇文章主要给大家介绍了关于C语言中if语句加大括号和不加大括号的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++中与输入相关的istream类成员函数简介

    C++中与输入相关的istream类成员函数简介

    这篇文章主要介绍了C++中与输入相关的istream类成员函数简介,包括eof函数和peek函数以及putback函数还有ignore函数,需要的朋友可以参考下
    2015-09-09
  • C++获得其他程序窗体控件中信息的方法

    C++获得其他程序窗体控件中信息的方法

    这篇文章主要介绍了C++获得其他程序窗体控件中信息的方法,涉及windows控件句柄的获取技巧,需要的朋友可以参考下
    2015-05-05
  • C++容器适配器的概念与示例

    C++容器适配器的概念与示例

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈,今天我们来探究一下stl容器适配器的使用吧
    2023-01-01
  • 基于OpenCv的运动物体检测算法

    基于OpenCv的运动物体检测算法

    这篇文章主要为大家详细介绍了基于OpenCv的运动物体检测算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言创建动态dll和调用dll(visual studio 2013环境下)

    C语言创建动态dll和调用dll(visual studio 2013环境下)

    本篇文章主要介绍了C语言创建动态dll和调用dll(visual studio 2013环境下),非常具有实用价值,需要的朋友可以参考下
    2017-11-11
  • c++之解决char转string时出现的乱码问题

    c++之解决char转string时出现的乱码问题

    这篇文章主要介绍了c++之解决char转string时出现的乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论