这一节中我们来讨论C语言自带的字符串处理函数。
与printf
不同,这些函数不在之前熟悉的头文件stdio.h
中。
而是在字符串专用的头文件string.h
中。
因此,请在代码的顶端加上下面这行代码。
#include <string.h>
接下来,我们将讨论一些常用的字符串处理函数的使用。
1. 获取字符串长度strlen
strlen
函数可以获取字符数组中的字符串长度。它从第一个字符开始计数,直到遇到'\0'
为止,并返回累计的长度。
strlen
的函数原型:
size_t strlen (const char * str);
输入:一个指向字符串首地址的指针。
输出:size_t
类型的整型,用于表示字符串长度。
对于输入参数,使用了const
修饰char
,函数内部将无法修改这个指针所指向的字符。如果输入参数为非const
的指针,会被转换为const
指针。
使用const
有两重意义:
- 保证函数内部不会修改指针所指向的字符。
- 提示使用者,传给该函数的字符串不会被修改。
对于第二点,当你遇到参数不带const
的函数时,你也许会怀疑在函数执行过后,会不会修改了数据。而对于带有const
的函数,你可以确信它不会修改任何数据。
对于输出参数,它是一个类型为size_t
的整型。
size_t
并不是一个新的关键词,它是已有整型变量的别名。
它有可能是unsigned int
别名。也有可能是unsigned long
或unsigned long long
的别名。取决于编译器怎样实现。同时,sizeof
关键词返回的结果也是size_t
类型的。
printf打印size_t
类型的整型时,虽然使用%d
,%u
在数值不大时可以正常打印结果。但是,使用转换规范%zu
是更加严谨的。
#include <stdio.h>
#include <string.h>
int main()
{
char str[20] = "Hello";
size_t size = sizeof(str);
printf("sizeof=%d\n", size);
size_t len = strlen(str);
printf("len=%d\n", len);
return 0;
}
strlen(str)测量从第一个元素开始直到元素值为'\0'的字符串长度。
sizeof(str)测量数组本身占用空间的大小。
2.字符串拼接函数strcat
字符串拼接函数strcat
,可以将源字符串的内容,拼接到目标字符串后面。
例如,源字符串为You\0
,目标字符串为ILove\0
。字符串拼接函数会将源字符串追加到目标字符串后面。使得目标字符串变为ILoveYou\0
。
strcat函数原型如下:
char * strcat (char * destination, const char * source);
输入:
char *destination
拼接目标字符串首地址
const char *source
拼接源目标首地址
输出:
char *destination
拼接目标字符串首地址
#include <stdio.h>
#include <string.h>
int main()
{
char dest[9] = "ILove";
char src[4] = "You";
// 拼接前
printf("%s\n", src);
printf("%s\n", dest);
// 拼接字符串
strcat(dest, src);
// 拼接后
printf("%s\n", src);
printf("%s\n", dest);
return 0;
}
拼接前:
源字符串为:You\0
目标字符串为:ILove\0
拼接后:
源字符串为:You\0
目标字符串为:ILoveYou\0
目标字符串所在的字符数组有9个元素,而拼接后ILoveYou\0
也有9个字符。所以,这样是没问题的。
但是,请格外注意目标字符串后必须还有足够空间。如果目标字符串所在的数组仅有8个元素,这样拼接后,多出来的字符将造成数组越界。