C语言--第九章 字符串、字符和字节
9.1字符串基础
字符串是一种很重要的数据类型,但C语言中并没有显式的字符串数据类型,字符串以字符串常量的形式出现或存储于字符数组中。字符串就是一串零个或多个字符,并以一个位模式为全0的NUL(NUL也是’\0’)字节结尾。因此字符串内部不能出现NUL字节。NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NUL字节,但它本身占有内存。字符串常量就是被双引号括起来的一串字符串。例如,字符串常量:
"Hello"
在内存中占有6字节的空间,分别是H、e、l、l、o和NUL。
9.2 字符串长度
字符串的长度就是它所包含的字符的个数。C语言函数库为我们提供了很多字符串相关的函数供我们使用。
9.2.1 字符串长度strlen
size_t strlen ( const char * str );
函数strlen返回类型为size_t(无符号整数类型,定义在stddef.h中),字符串以’\0’作为结束标志,strlen返回的是’\0’之前的字符的个数,不包含’\0’本身。
#include <stdio.h> //比较字符串长度
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
9.3 不受限制的字符串函数
最常用的字符串函数都是不受限制的,也就是说它们只通过寻找字符串结尾的NUL字节来判断长度。
9.3.1 复制字符串strcpy
用于复制字符串的函数strcpy,它的原型如下:
char* strcpy(char * destination, const char * source );
这个函数是把源字符串source复制到目标字符串destination的函数。它返回一个指向目标字符串的指针。参数 destination 是目标字符串的指针,它指向要复制到的位置。参数 source 是源字符串的指针,它指向要复制的字符串。strcpy 函数会将源字符串中的字符逐个复制到目标字符串中,直到遇到空字符 \0,表示字符串的结束。
以下是一个实例:
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello, world!";
char destination[20];
strcpy(destination, source);
printf("Copied string: %s\n", destination);
return 0;
}
以上代码将会输出:
Copied string: Hello, world!
注意:
1.由于destination参数会进行修改,因此它必须是个字符数组或者一个指向动态分配内存的数组的指针,不能是字符串常量。
2.在使用 strcpy 函数时,需要确保目标字符串 destination 的长度足够大,以容纳源字符串 source 的内容,否则可能会导致缓冲区溢出的问题。
考虑下面这个例子:
char message[] = "Original message";
...
if(...)
strcpy(message,"Different");
原数组包含内容如下:
新数组包含内容如下:
从结果可以看出,第一个NUL之后的几个字符被覆盖了,所以在使用这个函数时要确保目标参数足以容纳源字符串。