01 c基础之字符串

1.1 字符串三种形式:

  • 字符串常量

    用双引号扩起来的字符串常量(实际上也以\0结尾,会多占一个字节的内存。)注意空串""也要占一个字符。

  • 字符串变量

    存放于字符数组中,以\0结尾。用char数组存放字符串,数组元素个数至少为字符串长度+1。用cinscanf读入字符数组时,结尾会自动加\0cinscanf都读到空格为止。注意如果数组的字符个数超过了数组长度,会数组越界。

  • string对象

1.2 读入一行到字符数组

cinscanf都读到空格都会停止,要读一行则可以用下面的函数

cin.getline(char buf[], int bufSize)

读入一行(长度不超过bufSize-1),换行符不会写入buf,但是会从输入流中去掉。如果长度超过,会自动加\0

char line[10];
cin.getline(line, sizeof(line)); //最多读入9个字符

gets(char buf[])

与上面的函数不同,没有长度限制,可能会越界。

1.3 字符串库函数

  • 需要include<cstring>

  • 字符串库函数都根据\0来判断字符串结尾

  • 型参为char []类型,实参可以是char []或字符串常量

注意strlen不要放在for的条件判断中,因为strlen是从头数到尾,时间复杂度是O(n)。正确的用法是循环之前先求出长度。或者(因为\0的ascii码就是0)

char s[100] = "test";
for(int i = 0; s[i]; ++i){
// do something
}

1.4 例题:编写判断子串的函数

int Strstr(char s1[], char s2[])

  • 如果s2不是s1的子串,返回-1

  • 如果s2是s1的子串,返回其在s1中第一次出现的为止

  • 空串是任何串的子串,且出现位置为0

int Strstr(char s1[], char s2[]){
if(s2[0] == 0)
return 0;
for(int i = 0; s1[i]; ++i){
int j = 0;
for(; s2[j]; ++j){
if(s1[i+j] != s2[j])
break;
}
if(s2[j] == 0) // s2字符串已经遍历完,且包含在s1中
return i;
}
return -1;
}