0 #edu003. 学习材料 - 字符串处理

学习材料 - 字符串处理

  1. 字符数组与相关函数

字符数组是一种 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中原有字符 O(n)O(n)
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 O(1)O(1)
find a.find(b,pos); 从字符串pos位置开始向后查找b,如果找到子串,则返回第一次出现的左端点的下标;否则返回 string::npos O(lena×lenb)O(lena \times lenb)
insert a.insert(pos,b); 在字符串 a 的下标 pos 之前插入字符串 b O(lenb)O(lenb)
size a.size(); 返回字符串a中的字符个数 O(1)O(1)
substr a.substr(pos,len); 返回字符串a中从pos开始的len 个字符形式的字符串 O(len)O(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