龙空技术网

【C语言】(16)字符串标准库常用函数

游码客 177

前言:

如今同学们对“c语言中标准库函数可以重新定义吗”都比较关切,我们都想要知道一些“c语言中标准库函数可以重新定义吗”的相关文章。那么小编同时在网摘上汇集了一些有关“c语言中标准库函数可以重新定义吗””的相关内容,希望小伙伴们能喜欢,大家快快来学习一下吧!

1. strcpy - 复制字符串

strcpy(destination,source) 函数用于将 source 字符串复制到 destination 字符串。这会包括终止的空字符 '\0'

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char src[40] = "This is source";    char dest[100];    strcpy(dest, src);    printf("%s", dest);    return 0;}
2. strcat - 连接字符串

strcat(destination,source) 函数将 source 字符串连接到 destination 字符串的末尾,并覆盖 destination 的终止空字符 '\0',最后再添加一个新的终止空字符。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char src[50], dest[50];    strcpy(src, "This is source");    strcpy(dest, "This is destination");    strcat(dest, src);    printf("%s", dest);    return 0;}
3. strlen - 计算字符串长度

strlen(str) 函数计算字符串 str 的长度,直到但不包括终止的空字符。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char myString[] = "Hello, world!";    printf("字符串长度: %lld", strlen(myString));    return 0;}
4. strcmp - 比较两个字符串

strcmp 函数的作用是逐个字符比较两个字符串,直到遇到第一个不同的字符或遇到字符串的终止符 \0 为止。

使用 strcmp 函数时,确保两个字符串都是以 \0 结尾的,否则可能会导致未定义行为。由于 strcmp 函数是根据ASCII值进行比较的,所以它是区分大小写的。如果需要进行不区分大小写的比较,可以使用 strcasecmp_stricmp 函数(这取决于编译器和平台)。

int strcmp(const char *str1, const char *str2);

返回值

如果 str1str2 字符串相等,返回 0如果 str1 字符串大于 str2 字符串(按字典顺序),返回一个大于 0 的值。如果 str1 字符串小于 str2 字符串(按字典顺序),返回一个小于 0 的值。

字符串比较的规则

字符串的比较是基于字符串中字符的ASCII值进行的。 strcmp 函数从两个字符串的第一个字符开始比较,逐个字符地向后比较,直到发现不同的字符或者到达字符串的末尾( \0 字符)。

比较的过程中,如果两个字符串中的字符在某个位置不相等, strcmp 会根据这两个字符的ASCII值差异来决定返回值。如果 str1 中的字符ASCII值大于 str2 中相应位置的字符的ASCII值, strcmp 函数返回正值;如果小于,返回负值。

示例代码

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char str1[] = "hello";    char str2[] = "hello";    char str3[] = "hell";    char str4[] = "world";    printf("strcmp(str1, str2) = %d\n", strcmp(str1, str2)); // 输出:0    printf("strcmp(str1, str3) = %d\n", strcmp(str1, str3)); // 输出:1    printf("strcmp(str3, str1) = %d\n", strcmp(str3, str1)); // 输出:-1    printf("strcmp(str1, str4) = %d\n", strcmp(str1, str4)); // 输出:-1    return 0;}

在这个示例中:

strcmp(str1,str2) 比较的是两个相同的字符串,所以返回 0strcmp(str1,str3)str1str3 多一个字符 'o',在ASCII码表中 'o' 的值大于 \0str3 的终止字符),所以返回正值。strcmp(str3,str1) 是上述比较的相反情况,所以返回负值。strcmp(str1,str4) 中,第一个不同的字符是 'h' 和 'w',在ASCII码表中 'h' 的值小于 'w',所以返回负值。5. strchr - 搜索字符在字符串中的首次出现

strchr(str,c) 函数搜索字符 c 第一次出现在字符串 str 中的位置。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char str[] = "This is a sample string";    char* pch;    //通过strchr函数查找全部的字符‘s’    pch = strchr(str, 's');    while (pch != NULL) {        printf("位置在 %lld\n", pch - str + 1);        pch = strchr(pch + 1, 's');    }    return 0;}
6. strstr - 搜索子字符串

strstr(str,substr) 函数搜索子字符串 substr 第一次出现在字符串 str 中的位置。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char str[] = "This is a simple string,so simple";    char* pch;    pch = strstr(str, "simple");    while (pch != NULL) {        printf("位置在 %lld\n", pch - str + 1);        pch = strstr(pch+1, "simple");    }    return 0;}
7. strncpy - 复制指定长度的字符串

strncpy(dest,src,n) 函数用于将最多 n 个字符复制到 dest,如果 src 的长度小于 n,则剩余的部分将用空字符填充。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char src[40]="Hello, World!";  // 未初始化的数组元素是未定义的    char dest[25];    strncpy(dest, src, sizeof(dest));    dest[sizeof(dest) - 1] = '\0';  // 确保字符串结尾是 '\0'    printf("%s\n", dest); // Hello, World!    printf("字符串长度:%lld\n", strlen(dest)); // 13    char dest2[10];    strncpy(dest2, src, sizeof(dest2));    dest2[sizeof(dest2) - 1] = '\0';  // 确保字符串结尾是 '\0'    printf("%s\n", dest2); // Hello, Wo    printf("字符串长度:%lld\n", strlen(dest2)); // 8    return 0;}
8. strncat - 连接指定长度的字符串

strncat(dest,src,n) 函数将最多 n 个字符连接到 dest 的末尾。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char src[50], dest[50];    strcpy(src, "This is source");    strcpy(dest, "This is destination");    strncat(dest, src, 5);    printf("最终字符串 : |%s|", dest);    return 0;}
9. strncmp - 比较指定长度的两个字符串

strncmp(str1,str2,n) 函数比较两个字符串的前 n 个字符。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char str1[] = "Hello World!";    char str2[] = "Hello World2!";    if (strncmp(str1, str2, 11) == 0) {        printf("前11位是相等的");    }    return 0;}
10. strtok - 分割字符串

strtok(str,delim) 函数用于将字符串 str 根据分隔符 delim 分割成一系列的标记(token)。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>int main() {    char str[] ="hi- This, a sample string.lll";    char * pch;    pch = strtok(str, " ,.-");    while (pch != NULL) {        printf("%s\n", pch);        pch = strtok(NULL, " ,.-");    }    return 0;}
11. strerror - 获取错误消息字符串

用于将错误编号转换为对应的错误消息字符串。在处理系统调用或库函数失败时,它可以帮助程序员理解发生了什么错误。

不要修改 strerror 返回的字符串。该字符串可能指向静态分配的内存,对其的任何修改都是未定义行为。在多线程程序中使用 strerror 需要小心,因为它可能返回指向静态分配内存的指针,这可能导致数据竞争。为了解决这个问题,一些系统提供了 strerror_r 函数,它是线程安全的版本。

函数原型

char *strerror(int errnum);

参数

errnum:错误编号。这通常是全局变量 errno 的当前值, errno<errno.h> 头文件中定义,其值在系统调用或库函数发生错误时被设置。

返回值

strerror 函数返回一个指向错误消息字符串的指针。这个字符串描述了参数 errnum 对应的错误。

示例代码

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <errno.h>int main() {    FILE* fp;    // 尝试打开一个不存在的文件    fp = fopen("nonexistent_file.txt", "r");    if (fp == NULL) {        // 使用 strerror 输出错误消息        printf("Error opening file: %s\n", strerror(errno));    }    return 0;}

在这个示例中,尝试打开一个不存在的文件会导致 fopen 函数失败,并设置 errno 为对应的错误编号。然后, strerror 函数被用来获取这个错误编号的文本描述,并打印出来。这对于调试和错误处理非常有帮助。

常见用法

在处理文件操作、网络通信、内存分配等可能失败的系统调用或标准库函数后,使用 strerror 来获取失败的具体原因。在日志记录或错误报告中,提供比简单的错误编号更具可读性的错误信息。

标签: #c语言中标准库函数可以重新定义吗 #c语言strcmp函数头文件