9-3. 字符串处理函数

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

这一节中我们来讨论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有两重意义:

  1. 保证函数内部不会修改指针所指向的字符。
  2. 提示使用者,传给该函数的字符串不会被修改。

对于第二点,当你遇到参数不带const的函数时,你也许会怀疑在函数执行过后,会不会修改了数据。而对于带有const的函数,你可以确信它不会修改任何数据。

对于输出参数,它是一个类型为size_t的整型。

size_t并不是一个新的关键词,它是已有整型变量的别名。 它有可能是unsigned int别名。也有可能是unsigned longunsigned 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个元素,这样拼接后,多出来的字符将造成数组越界。

字符串拼接越界