概述:
字符串是由零个或多个字符组成的有限序列。
子串:串中任意个连续的字符组成的子序列。
字符串是最常见和常考的一种类型,有很多演化的问题,例如最长公共子序列等,这里就不介绍了,只了解一下相关的基本知识和标准库的一些函数。
2.1 C风格字符串
包含两种:
1)字符串常量:以双引号括起来的字符序列是字符串常量。为了兼容C语言,C++所有的字符串常量都由编译器自动在末尾添加一个空字符。
例:字符常量'A'表示单个字符A,然后"A"是字符串常量,其表示字母A和空字符(null)两个字符。
2)末尾添加了'\0'的字符数组。
C++语言通常用char*/const char*类型的指针来操纵C语言中的字符串,一般来说,我们使用指针的算术操作来遍历C风格字符串,直到到达结束符null为止。
const char *cp = "hello world";
while(*cp) {
//...
cp++;
}
注:最后的'\0'会转化为十进制的0,因此可以用while(*cp)来判断。
举个小例子,可以以此来求得字符串的长度:
int len(char *x) {
char *y = x;
while(*y++); // 一直走到null
return (y - x - 1); // 同类型指针相减 返回值为距离
}
2.2 标准库中提供的字符串处理函数
C/C++提供了众多的字符串处理函数,下表介绍了主要的一些函数:
strlen(s) |
返回s的长度,不包括字符串结束符null |
strcmp(s1, s2) |
比较两个字符串s1和s2是否相同。若相等,返回0;若s1大于s2,返回正数;否则返回负数。 |
strcat(s1, s2) |
将字符串s2连接到s1后,返回s1 |
strcpy(s1, s2) |
将s2复制给s1,并返回s1 |
strncat(s1,s2,n) |
将s2的前n个字符连接到s1后面,并返回s1 |
strncpy(s1,s2,n) |
将s2的前n个字符复制给s1,并返回s1 |
再弄清楚两个容易混淆的函数:
1)memcpy
void *memcpy(void *dest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。函数返回指向dest的指针。
2)memset
void *memset(void *s, int ch, size_t n);
功能:将s中前n个字节用ch替换并返回s,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作最快的一种方法。
下面写一个知识点:
strcpy和memcpy的区别:
1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2.复制的方法不同。strcpy不需要指定长度,遇到被复制字符串的结束符'\0'才结束,所以容易溢出。memcpy则根据第三个参数来决定复制的长度。
3.用途不同。通常在复制字符串的时候用strcpy,其他类型的时候用memcpy。
字符串的基本知识就复习到这里了,字符串的实际应用时最广泛的,这就要好好的研究算法了,希望大家能记住这部分的知识~。~
返回目录 -> C/C++基础知识概述