
大家好啊这里是阳阳的博客一个正在努力学习技术的大学生。前面几篇我们把数组系列重新梳理了一遍从数组下标到题目应用再到一些基础练习。从这篇开始我们进入字符串系列。刚开始学字符串时很多同学最容易混的地方就是字符数组和string。它们都能存文字但写法和使用体验差别挺大。今天这篇我们先不讲复杂函数先把字符数组和string的基本区别讲清楚。好了废话不多说咱们直接开始。1.字符串其实就是一串字符在正式讲字符数组和string之前我们先把“字符串”这个词想简单一点。比如hello它看起来是一个单词但从程序角度看它其实由多个字符组成h e l l o再比如yangyang里面也是一串字符y a n g y a n g所以字符串可以先理解成多个字符按照顺序排在一起形成的一段文本。前面我们学数组的时候数组可以保存一组数据int a[5] {1, 2, 3, 4, 5};如果换成字符也可以有一组字符char s[6] {h, e, l, l, o};这样看字符串和数组其实是有关系的。字符数组就是用数组的方式来存放一串字符。2.字符数组的基本写法字符数组本质上还是数组只不过数组里的每个元素都是char类型。比如char str[6] {h, e, l, l, o};这里定义了一个字符数组str里面可以放 6 个字符。有些同学可能会觉得奇怪hello明明只有 5 个字符为什么这里开了长度 6这是因为 C 风格字符串后面通常会有一个特殊的结束标记\0它表示字符串到这里结束。所以更完整地看字符数组里可能是这样h e l l o \0这个\0不会像普通字符那样显示出来但它对字符数组来说很重要。程序通过它判断字符串在哪里结束。C 里还可以更方便地写成char str[6] hello;这行代码会自动把h、e、l、l、o和结尾的\0放进去。如果写成char str[5] hello;就容易出问题因为 5 个位置刚好只能放hello这 5 个字符没有位置留给结尾的\0。这个地方刚开始确实容易忽略。很多同学看字符数组时会只数看得见的字符却忘了结尾还有一个隐藏的结束标记。3.string 的写法更接近日常使用相比字符数组string用起来就轻松很多。比如保存一个字符串#include iostream using namespace std; int main() { string s; cin s; cout s endl; return 0; }对于刚开始学 C 的同学来说string的体验会更自然一些。你不用提前特别精确地计算数组要开多大也不用手动考虑\0这种细节。比如string name; name Tom; name Yangyang; name HelloWorld;这些写法都比较直观。而如果用字符数组很多操作就没那么随意。字符数组长度是固定的开小了装不下开大了又会浪费一些空间。后面如果涉及复制、拼接、比较字符数组也会比string麻烦很多。所以很多时候我们在写普通 C 题目时会优先使用string。四、字符数组和 string区别前面我们分别看了字符数组和 string 的基本写法接下来我们直接对比一下它们最核心的区别。区别一长度能不能变字符数组的长度是固定的。char str[20] hello;这里str最多只能放 20 个字符包括结尾的\0。如果后面想改成更长的字符串比如str hello world, this is a very long sentence; // 放不下就会出问题因为数组的空间在定义时就已经定死了。string 没有这个限制。string s hello; s hello world, this is a very long sentence; // 没问题string 会自动调整大小不用我们操心空间够不够。区别二整体赋值能不能做看下面两段代码char a[20] hello; a world; // 编译报错 string b hello; b world; // 没问题数组名本身是一个固定的地址不能把它当成普通变量那样整体赋值。但 string 可以因为它本质上是一个专门管理字符串的类支持直接赋值。很多同学刚开始会写a world然后编译报错。这里先记住字符数组只能在定义时整体初始化不能之后整体赋值。区别三操作方式不一样字符数组如果要复制、拼接、比较需要用专门的函数比如strcpy字符串复制、strcat字符串拼接和strcmp字符串比较。这些函数都来自 C 语言标准库cstring或string.h用起来需要特别注意细节strcpy(dest, src)把src字符串包括结尾的\0复制到dest字符数组中。使用时必须确保dest数组足够大能装下src的全部字符否则会导致缓冲区溢出。strcat(dest, src)把src字符串拼接到dest字符串的末尾。同样需要保证dest数组剩余空间足够容纳src否则也会溢出。strcmp(s1, s2)比较两个字符串。返回值为 0 表示相等小于 0 表示s1小于s2按字典序大于 0 表示s1大于s2。这些函数用起来不太直观而且稍不注意就容易写错。string 直接支持这些操作string a hello; string b world; string c a b; // 拼接helloworld bool flag (a b); // 比较false a b; // 赋值a 变成 world这种写法和我们平时的思维方式更接近所以初学阶段用 string 写题会顺手很多。5.输入字符串时要注意空格无论是字符数组还是string用cin输入时都有一个共同特点遇到空格会停止。比如string s; cin s; cout s;如果输入hello world输出通常只有hello因为cin s会把空格当成分隔。字符数组也类似char str[20]; cin str; cout str;输入hello world时也只会读到hello。这个问题很多同学第一次遇到时会很疑惑明明输入了一整句为什么程序只拿到了前半部分。这里先记住cin读取字符串时默认按空格分开。如果以后要读取带空格的一整行可以用getline(cin, s);不过getline还有一些和换行符有关的小细节我们后面再单独说。现在先把最基础的输入方式掌握住就行。总结今天这篇我们主要聊了字符数组和string的区别。字符串可以理解成一串字符。字符数组是用数组来保存字符通常需要考虑长度和结尾的\0。string是 C 提供的字符串类型用起来更方便也更适合初学阶段写题。这篇先记住几个点字符串是多个字符按顺序组成的文本。字符数组本质上是char类型的数组。字符数组保存字符串时结尾通常有\0。string使用更方便可以直接赋值、输入、输出。初学阶段可以优先练string同时了解字符数组的基本概念。那这篇就先到这里。如果觉得有帮助记得点赞、关注和收藏谢谢有什么问题欢迎在评论区留言我们一起交流。我们下篇见