C语言常用字符串函数:长度、比较、拼接和查找

对于字符串来说,支持通过在 `` 头文件中的函数,进行字符串的长度、复制、连接、比较、查找等操作。常见的字符串处理函数和功能列表。

获取字符串长度

对于C语言字符串来说,可以通过 `strlen()` 函数获取字符串的长度。字符串的长度为指针指向首地址,到首个字符串结束的空字符 `\0` 之间的字符数(不包括空字符),可通过遍历计数来实现。

对于strlen函数,其原型如下所示。

plaintext 复制代码
// 函数声明 strlen
// 函数功能:获取字符串的长度
// str:指向字符串首地址的指针
// 返回值:字符串的长度,类型为 size_t
size_t strlen(const char *str);

这里size_t是C语言中定义的无符号整数类型,用于表示字符串的长度。其具体类型一般与平台相关,在编译时确定;在32位平台上,size_t一般为32位无符号整数,在64位平台上,size_t一般为64位无符号整数。对于strlen的返回,建议使用size_t类型,避免返回值类型隐式转换导致数据错误。

对于strlen的测试示例如下所示。

plaintext 复制代码
#include 
#include 
int main(int argc, char *argv[])
{
    const char *str = "hello world";
    char str1[20] = "hello world";
    printf("strlen(str) = %zu\n", strlen(str)); // strlen(str) = 11
    printf("strlen(str1) = %zu\n", strlen(str1)); // strlen(str1) = 11
    return 0;
}

对于上述代码,具体执行结果如下所示。

字符串拷贝

对于C语言字符串来说,可以通过 `strcpy()` 函数和 `strncpy()` 函数进行字符串的拷贝复制。

这两个函数的原型如下所示。

plaintext 复制代码
// 函数声明 strcpy
// 函数功能:将字符串src复制到字符串dest中
// dest:指向目标字符串首地址的指针
// src:指向源字符串首地址的指针
// 返回值:指向目标字符串首地址的指针
char *strcpy(char *dest, const char *src);
// 函数声明 strncpy
// 函数功能:将字符串src复制到字符串dest中,最多复制n个字符
// dest:指向目标字符串首地址的指针
// src:指向源字符串首地址的指针
// n:最多复制的字符数
// 返回值:指向目标字符串首地址的指针
char *strncpy(char *dest, const char *src, size_t n);

strcpy用于将源字符串复制的目标字符串,复制的长度为源字符串的长度;如果目的字符串的长度不足,仍然会继续写入,因此使用strncpy函数,可以指定最多复制的长度,避免写入超出目的字符串长度的内容。

对于strncpy,根据复制长度n的不同,具有以下特点。

需要注意的是,strcpy复制后,会在末尾添加'\0'作为结束字符,因此不需要手动添加。而strncpy复制后,并不会自动在末尾添加'\0'作为结束字符,因此需要复制前清零目的字符串或者复制后在末尾手动添加。这两个函数对于结尾的处理是不同的,在复制后需要注意。

对于strcpy和strncpy的测试示例如下所示。

plaintext 复制代码
#include 
#include 
int main(int argc, char *argv[])
{
    char src[15] = "hello world";
    char dest[20] = {0};
    char *ptr;
    ptr = strcpy(dest, src);
    printf("dest = %s\n", dest); // dest = hello world
    printf("ptr = %s\n", ptr); // ptr = hello world
    strncpy(dest, src, 5);
    dest[5] = '\0';
    printf("dest = %s\n", dest); // dest = hello
    return 0;
}

对于上述代码,具体执行结果如下所示。

字符串比较

对于C语言字符串来说,可以通过 `strcmp()` 函数和 `strncmp()` 函数进行字符串的比较。

这两个函数的原型如下所示。

plaintext 复制代码
// 函数声明 strcmp
// 函数功能:比较字符串str1和字符串str2
// str1:指向第一个字符串首地址的指针
// str2:指向第二个字符串首地址的指针
// 返回值:如果str1等于str2,返回0;如果str1大于str2,返回一个大于0的值;如果str1小于str2,返回一个小于0的值
int strcmp(const char *str1, const char *str2);
// 函数声明 strncmp
// 函数功能:比较字符串str1和字符串str2的前n个字符
// str1:指向第一个字符串首地址的指针
// str2:指向第二个字符串首地址的指针
// n:最多比较的字符数
// 返回值:如果str1等于str2,返回0;如果str1大于str2,返回一个大于0的值;如果str1小于str2,返回一个小于0的值
int strncmp(const char *str1, const char *str2, size_t n);

对于strcmp函数,比较的停止条件包括按照从左到右的顺序遇到不同的字符串,或者任意一个字符串检测到'\0'表示比较结束。对于strncmp函数,除了上述条件外,还包括到达指定的比较长度n。对于字符串的大小,主要按照字符的ASCII码进行比较,字符在前则返回负值,字符在后返回正值。

对于strcmp和strncmp函数,具体示例如下所示。

plaintext 复制代码
#include 
#include 
int main(int argc, char *argv[])
{
    char str1[] = "asio_user";
    char str2[] = "asio_user_test";
    // 字符串比较 strcmp
    if (strcmp(str1, str2) == 0) {
        printf("str1 = str2\n");
    } else {
        printf("str1 != str2\n");
    }
    // 字符串比较 strncmp, 比较长度小于两个字符串长度
    if (strncmp(str1, str2, 9) == 0) {
        printf("str1 = str2 (first 9 chars)\n");
    } else {
        printf("str1 != str2 (first 9 chars)\n");
    }
    // 字符串比较 strncmp, 比较长度大于两个字符串长度
    if (strncmp(str1, str2, 15) == 0) {
        printf("str1 = str2 (first 15 chars)\n");
    } else {
        printf("str1 != str2 (first 15 chars)\n");
    }
    return 0;
}

对于上述代码,具体执行结果如下所示。

字符串查找

对于C语言字符串来说,支持如下字符串查找函数。

这三个函数的原型如下所示。

plaintext 复制代码
// 函数声明 strchr
// 函数功能:在字符串str中查找字符c第一次出现的位置
// str:指向字符串首地址的指针
// c:要查找的字符
// 返回值:如果找到字符c,返回指向该字符的指针;如果未找到字符c,返回NULL
char *strchr(const char *str, int c);
// 函数声明 strrchr
// 函数功能:在字符串str中查找字符c最后一次出现的位置
// str:指向字符串首地址的指针
// c:要查找的字符
// 返回值:如果找到字符c,返回指向该字符的指针;如果未找到字符c,返回NULL
char *strrchr(const char *str, int c);
// 函数声明 strpbrk
// 函数功能:在字符串str中查找任意字符firstc和任意字符lastc之间的字符
// str:指向字符串首地址的指针
// firstc:要查找的字符范围的第一个字符
// lastc:要查找的字符范围的最后一个字符
// 返回值:如果找到任意字符在firstc和lastc之间,返回指向该字符的指针;如果未找到任意字符在firstc和lastc之间,返回NULL
char *strpbrk(const char *str, const char *firstc, const char *lastc);
// 函数声明 strstr
// 函数功能:在字符串str中查找子字符串substr第一次出现的位置
// str:指向字符串首地址的指针
// substr:指向子字符串首地址的指针
// 返回值:如果找到子字符串substr,返回指向该子字符串的指针;如果未找到子字符串substr,返回NULL
char *strstr(const char *str, const char *substr);

对于strchr和strrchr函数来说,都是在字符串中查找字符,返回字符的指针;如果未找到字符,返回NULL。strpbrk函数和strstr函数都是查找子字符串,不过查找的区别是strpbrk函数查找任意字符,strstr函数查找子字符串;同样是成功返回子字符串的指针,失败返回NULL。

关于字符串查找函数,具体示例如下所示。

plaintext 复制代码
#include 
#include 
int main(int argc, char *argv[])
{
    char str1[] = "asio_user";
    char str2[] = "asio_user_test";
    // 字符串查找 strchr
    char *p = strchr(str1, 's');
    if (p != NULL) {
        printf("strchr: %s\n", p);
    } else {
        printf("strchr: not found\n");
    }
    // 字符串查找 strrchr
    p = strrchr(str1, 's');
    if (p != NULL) {
        printf("strrchr: %s\n", p);
    } else {
        printf("strrchr: not found\n");
    }
    // 字符串查找 strpbrk
    p = strpbrk(str1, "io");
    if (p != NULL) {
        printf("strpbrk: %s\n", p);
    } else {
        printf("strpbrk: not found\n");
    }
    // 字符串查找 strstr
    p = strstr(str1, "user");
    if (p != NULL) {
        printf("strstr: %s\n", p);
    } else {
        printf("strstr: not found\n");
    }
}

对于上述代码,具体执行结果如下所示。

字符串拼接

对于C语言字符串来说,可以通过`strcat()`函数和`strncat()`函数在字符串末尾拼接字符串。函数的原型如下所示。

plaintext 复制代码
// 函数声明 strcat
// 函数功能:将字符串src拼接到字符串dest的末尾
// dest:指向字符串首地址的指针
// src:指向要拼接的字符串首地址的指针
// 返回值:返回指向拼接后的字符串的指针
char *strcat(char *dest, const char *src);
// 函数声明 strncat
// 函数功能:将字符串src拼接到字符串dest的末尾,最多拼接n个字符
// dest:指向字符串首地址的指针
// src:指向要拼接的字符串首地址的指针
// n:要拼接的最大字符数
// 返回值:返回指向拼接后的字符串的指针
char *strncat(char *dest, const char *src, size_t n);

对于strcat函数来说,将字符串src拼接到字符串dest的末尾,返回拼接后的字符串的指针;在拼接时不会考虑dest字符串的长度,所以dest字符串必须有足够的空间来存储拼接后的字符串,否则会导致缓冲区溢出。strncat函数则可以指定最多拼接n个字符,避免缓冲区溢出的问题。

关于字符串拼接函数,具体示例如下所示。

plaintext 复制代码
#include 
#include 
int main(int argc, char *argv[])
{ 
    char str1[] = "hello";
    char str2[] = " world";
    char str3[20];
    // 字符串拼接 strcat
    strcat(str3, str1);
    printf("str3: %s\n", str3);
    strcat(str3, str2);
    printf("str3: %s\n", str3);
    // 字符串拼接 strncat
    memset(str3, 0, sizeof(str3));
    strncat(str3, str1, 3);
    printf("str3: %s\n", str3);
    return 0;
}

对于上述代码,具体执行结果如下所示。

相关推荐
yzq1991272 小时前
C语言#和##的用法(附带示例)
c语言·宏定义·预处理运算符·字符串化·标记连接
无敌昊哥战神4 小时前
【LeetCode 37】解数独 (Sudoku Solver) —— 回溯法详解 (Python/C/C++)
c语言·c++·python·算法·leetcode
jinyishu_5 小时前
链表经典OJ题
c语言·数据结构·算法·链表
爱编码的小八嘎5 小时前
C语言完美演绎9-14
c语言
li1670902705 小时前
第二十五章:C++11(下)
c语言·开发语言·数据结构·c++
代码中介商17 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
爱编码的小八嘎19 小时前
C语言完美演绎9-12
c语言
Navigator_Z21 小时前
LeetCode //C - 1031. Maximum Sum of Two Non-Overlapping Subarrays
c语言·算法·leetcode
leoufung1 天前
LeetCode 30:Substring with Concatenation of All Words 题解(含 C 语言 uthash 实现)
c语言·leetcode·c#