0 #edu003. 学习材料 - 字符串处理
学习材料 - 字符串处理
- 字符数组与相关函数
字符数组是一种 C 语言风格的字符串,在 C++ 中依然被保留下来。如下定义一个字符数组:
char a[10];
如果要在定义的时候进行初始化,可以用:
char a[10]="Hello";
等价于
char a[10]={'H','e','l','l','o'};
**注意:上面两种方式,a[5]=0, 即'\0' **
a[5]=0
,即a[5]='\0'
,'\0'
是字符数组终止符,它的 ASCII 码是 0
,有关字符数组的函数都需要利用'\0'
终止符工作。对字符数组初始化或读入等操作时,都会自动在字符数组末尾补上一个'\0'
,它也会占据数组一个位置,如果没有预留这个位置就会超成数组越界。
除了整数数组的操作方法,字符数组还有其独有的函数。在cstring 或 string.h 头文件中有许多对字符数组进行操作的函数,如下表。注意,使用这些函数必须确保字符数组末尾有终止符'\0'
.
字符数组读入例子
char ch[101];
scanf("%s",ch); //遇到空格会停下来,不会读入空格,从ch[0]开始存入
scanf("%s",ch+1); //从ch[1]开始存入
cin>>ch;
cin>>(ch+1);
cin.getline(ch,sizeof(ch)); //会读入空格,读入一行,遇到换行停止
字符数组函数
函数 | 语法 | 功能 | 时间复杂度 |
---|---|---|---|
strcpy |
strcpy(a,b); |
将字符数组b复制到a中,并覆盖a中原有字符 | |
strcat |
strcat(a,b); |
将字符数组b拼接到a的后面 | |
strlen |
strlen(a); |
返回a的终止符'\0' 前面的字符个数 |
|
strcmp |
strcmp(a,b); |
如果a和b完全相同,则返回0;否则设第一对不相同的字符为a[i]和b[i],返回a[i]-b[i]的值(对应ASCII码相减) | |
strchr |
strchr(a,x); |
如果 x 在 a 中出现,这返回第一次出现的指针;否则返回空指针 null |
|
strstr |
strstr(a,b); |
如果b是a的子串,则返回第一次出现的位置的左端点指针;否则返回空指针 null |
tips: 一些教材里使用 gets()
函数将字符串读入字符数组,但由于存在字符数组越界的分风险,不再建议使用,新的 C++11 标准更是删除了这个函数。 而输出一个字符串还可以使用 puts()
函数( puts()
会自动输出换行),puts()
在新标准中未被弃用。
2.string类与相关函数
string是 C++ 的字符串类型,需要引用 string
头文件。如下定义一个字符串:
string a;
string b="Hello"; //b之后没有字符数组终止符 '\0'
字符串的下标从 0 开始,并且支持用 a[i]
的形式访问下标为 i
的位置的字符,但如果超出当前长度会造成越界。
字符串常用方法
方法 | 语法 | 功能 | 时间复杂度 |
---|---|---|---|
+ | c=a+b; | 拼接字符串 a 和 b ,赋值给c | |
+= | a+=b; | 在字符串a的末尾添加字符串b | |
push_back |
a.push_back(x); |
在字符串的末尾加入一个字符x | |
find |
a.find(b,pos); |
从字符串pos位置开始向后查找b,如果找到子串,则返回第一次出现的左端点的下标;否则返回 string::npos | |
insert |
a.insert(pos,b); |
在字符串 a 的下标 pos 之前插入字符串 b | |
size |
a.size(); |
返回字符串a中的字符个数 | |
substr |
a.substr(pos,len); |
返回字符串a中从pos开始的len 个字符形式的字符串 |
string
详细用法点击string - baoyixu 的博客
string 读入
string 不支持C中scanf的读入,不建议利用a.c_str()
强行使用。
string a;
cin>>a; //遇到空格会停止,从a[0]开始存入
getline(cin,a); //读入一行,遇到换行停止
string 易错点
string 类是动态分配空间,当使用下标访问的时候,很容易越界访问。string 定义完后,初始长度较小,可以使用 resize()
函数,修改默认长度。
例如:
string s;
for(int i=0;i<=100;i++)
s[i]='0'; //string 定义完后,初始长度较小,下标直接访问就越界了
正确做法
string s;
s.reszie(100+5); //修改 string 长度
for(int i=0;i<=100;i++)
s[i]='0';
学习完毕
{{ select(1) }}
- YES
- NO