C++字符串详解

用字符数组存放字符串容易发生数组越界的错误,而且往往难以察觉。因此,C++ 标准模板库设计了 string 数据类型,专门用于字符串处理。

string 类型的变量就是用来存放字符串的,也叫“string对象”。string 并不是 C++ 的基本数据类型,它是 C++ 标准模板库中的一个“类”。关于这一点,现在不必深究,以后会学到。这里只要学会如何使用 string 对象即可。
要使用 string 对象,必须包含头文件 <string>。

char数组:存储单字符
int数组:存储整型

字符型数组

cpp

char a[7]={'a','2','A','#','&',' '};

字符数组元素都是单个字符

字符串

cpp

char a[5]=“hello";

错误的表现形式
存储字符串的时候,数组长度要给字符串结尾’\0’留一个长度防止越界。

cpp

char a[6]=“hello";
char a[6]={“hello"};
char a[6]={'h','e','l','l','o','\0'};

字符数组的输入

输入

循环遍历将元素依次输入

cpp

char a[101];
int n;
cin>>n
for(int i=1; i<=n; i++) cin>>a[i];

直接输入

cpp

char a[101];
cin>>a;

带空格的输入

cin.getline(数组名,数组长度)

cpp

cin.getline(a,101);

gets(数组名);
头文件#include <cstdio>
注意连用cin和cin.getline()函数时,需要在中间加一个cin.ignore(); 用于清除缓存。

输出

循环遍历将元素依次输出

cpp

for(int i=0;i>n;i++) cout>>a[i];

直接输出:

cout>>a

字符数组常用函数

头文件:#include <cstring>
获取数组有效长度:strlen(数组名),strlen(a), strlen(“hello”);

  1. 将b字符数组拼接到a字符数组后
  2. strcat(a,b)

  3. 将b字符数组复制给字符数组
  4. strcpy(a,b)

  5. 比较a字符数组和b字符数组的大小
  6. strcmp(a,b)

    char a[4]=”abc”;
    char a[3]=”ad”;
    对位比较大小, ASCII码大的该位大。
    if(strcmp(a,b)>0) — a>b
    if(strcmp(a,b)==0) — a=b
    if(strcmp(a,b)<0) — a<b

  7. 反转函数
  8. char a[6]=”hello”;
    cout<<strrev(a);

  9. 额外的函数
  10. 头文件: #include <cstype>
    isalnum(); 验证字母和数字
    isalpha(); 验证字母
    isdigit(); 验证数字
    islower(); 验证小写
    isupper(); 验证大写
    tolower(); 转换为小写
    toupper(); 转换为大写

string类型字符串

“” 0个或多个字符

声明

string a;

初始化

string a=”abc”;

不带空格输入

cin>>a

使用for循环依次输入

带空格输入

getline(cin,a);

输出

cout<<a

使用for循环依次输出

获取字符串长度函数

头文件:#include <string>
length()函数

a.length();

连用cin和getline()函数时,需要在中间加一个cin.ignore();用于清除缓存。

string常用函数

头文件:#include <string>

字符串的拼接

cpp

string a,b;
a=a+b;cout<<a;

字符串的赋值

cpp

string a,b;
cin>>a;
b=a;cout<<b;

比较大小

a>=b —-> 真或者假
a==b —-> 真或者假
a<=b —-> 真或者假
a!=b —-> 真或者假

查找

cpp

str.find("ab");
//返回字符串ab在str的位置

子串

cpp

str.substr(3);
//返回[3]及以后的子串

str.substr(2,4);
//返回str[2]~str[2+(4-1)] 子串(即从[2]开始4个字符组成的字符串

替换

cpp

str.replace(2, 4, "sz");
//返回把[2]~[2+(4-1)]的内容替换为“sz”后的新字符串

.str.replace(2, 4, "abcd", 3)
//返回把[2]~[2+(4-1)]的内容替换为“abcd”前3个字符后的新字符串

插入

cpp

str.insert(2, "sz");
//从[2]位置开始添加字符串“sz”,并返回形成的新字符串

.str.insert(2, "abcd", 3)
//从[2]开始添加字符串“abcd”前3个字符,并返回形成的新字符串

.str.insert(2, "abcd", 1, 3)
//从[2]开始添加字符串“abcd”前[2]~[2+(3-1)]个字符,并返回形成的新字符串

专项练习题

  1. 密码翻译
  2. 简单密码
  3. 大小写字母互换
  4. 字符串判等
  5. 加密的病历单
  6. 验证子串
  7. 字符串移位包含问题
  8. 单词的长度
  9. 说反话
  10. 单词翻转
  11. 标题统计-noip2018 普及组
  12. ISBN 号码-noip2008 普及组
  13. 乒乓球-noip2003 普及组
  14. 多项式输出-noip2009 普及组
  15. 回文素数
  16. 素数对
小王发布于2022-04-15 07:54
没有伞的孩子,必须学会努力奔跑。

赞助 点赞 0

Boke.One, 禹步网, 叶开楗等人对本文发表了5条热情洋溢的评论。
  • Boke.One说道: LV.0
    太强了!!!
  • 禹步网说道: LV.0
    这是学了多少语言,值得学习
    1. 老王说道:
      回复 禹步网: 目前他只学了Python和C++,不过C++主要是信奥赛方面的!
  • 叶开楗说道: LV.1
    我从来没有这样学习过,笔记做的很好。😍
    1. 老王说道:
      回复 叶开楗: 学好就可以了,怎么学不重要!😀
  • 发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注