当前位置:   article > 正文

C语言标准库介绍:<string.h>

C语言标准库介绍:<string.h>

在C语言中,<string.h>头文件是标准库中的一个重要部分,它定义了一系列操作字符串和字符数组的函数。本文将详细介绍<string.h>头文件中包含的22个函数,并提供每个函数的完整示例代码。

简介

<string.h>头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。在使用这些函数之前,我们首先来了解一下相关的库变量和宏。

库变量

<string.h>头文件中定义的变量类型如下:

  1. size_t: 无符号整数类型,通常用于表示内存块的大小。它是 sizeof 关键字的结果。

库宏

<string.h>头文件中定义的宏如下:

  1. NULL: 表示空指针常量的值。

接下来,我们将逐个介绍这22个函数,并给出每个函数的示例代码。

库函数

1. void *memchr(const void *str, int c, size_t n)

在字符串的前 n 个字节中搜索第一次出现字符 c 的位置。

#include <stdio.h>
#include <string.h>

int main() {
    const char str[] = "Hello, world!";
    const char ch = 'o';
    const size_t n = strlen(str);

    const char *result = memchr(str, ch, n);
    
    if (result != NULL) {
        printf("'%c' found at position: %ld\n", ch, result - str);
    } else {
        printf("'%c' not found in the string.\n", ch);
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2. int memcmp(const void *str1, const void *str2, size_t n)

比较两个内存区域的前 n 个字节。

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "abc";
    const char str2[] = "abd";
    const size_t n = 2;

    int result = memcmp(str1, str2, n);
    
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3. void *memcpy(void *dest, const void *src, size_t n)

从源地址复制 n 个字节到目标地址。

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    memcpy(dest, src, strlen(src) + 1);
    
    printf("Copied string: %s\n", dest);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4. void *memmove(void *dest, const void *src, size_t n)

从源地址复制 n 个字节到目标地址,处理重叠的情况。

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "memmove can be very useful......";
    memmove(str + 20, str + 15, 11);
    printf("%s\n", str);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. void *memset(void *str, int c, size_t n)

将字符 c 复制到字符串的前 n 个字符。

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, world!";
    memset(str + 7, '*', 5);
    printf("%s\n", str);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6. char *strcat(char *dest, const char *src)

将 src 追加到 dest 的末尾。

#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello, ";
    const char src[] = "world!";
    strcat(dest, src);
    printf("%s\n", dest);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

7. char *strncat(char *dest, const char *src, size_t n)

将 src 的最多 n 个字符追加到 dest 的末尾。

#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello, ";
    const char src[] = "world!";
    strncat(dest, src, 3);
    printf("%s\n", dest);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

8. char *strchr(const char *str, int c)

在字符串中搜索第一次出现字符 c 的位置。

#include <stdio.h>
#include <string.h>

int main() {
    const char str[] = "This is a sample string";
    const char ch = 's';
    const char *result = strchr(str, ch);
    
    if (result != NULL) {
        printf("'%c' found at position: %ld\n", ch, result - str);
    } else {
        printf("'%c' not found in the string.\n", ch);
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

9. int strcmp(const char *str1, const char *str2)

比较两个字符串。

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "abc";
    const char str2[] = "abcd";
    
    int result = strcmp(str1, str2);
    
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

10. int strncmp(const char *str1, const char *str2, size_t n)

比较两个字符串的前 n 个字符。

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "abc";
    const char str2[] = "abcd";
    
    int result = strncmp(str1, str2, 3);
    
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0

) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

11. int strcoll(const char *str1, const char *str2)

根据当前区域设置比较两个字符串。

#include <stdio.h>
#include <string.h>
#include <locale.h>

int main() {
    setlocale(LC_COLLATE, "en_US.utf8");
    
    const char str1[] = "apple";
    const char str2[] = "banana";
    
    int result = strcoll(str1, str2);
    
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

12. char *strcpy(char *dest, const char *src)

复制一个字符串。

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[20];
    
    strcpy(dest, src);
    
    printf("Copied string: %s\n", dest);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

13. char *strncpy(char *dest, const char *src, size_t n)

复制一个字符串的前 n 个字符。

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[20];
    
    strncpy(dest, src, 5);
    dest[5] = '\0'; // Null-terminate the string
    
    printf("Copied string: %s\n", dest);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

14. size_t strcspn(const char *str1, const char *str2)

返回字符串 str1 开头连续不含字符串 str2 中的字符的长度。

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "1234567890";
    const char str2[] = "aeiou";
    
    size_t len = strcspn(str1, str2);
    
    printf("Length until first vowel: %ld\n", len);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

15. char *strerror(int errnum)

返回错误号 errnum 对应的错误消息字符串。

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    FILE *file;
    file = fopen("nonexistentfile.txt", "r");
    
    if (file == NULL) {
        perror("Error");
        printf("Error message: %s\n", strerror(errno));
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

16. size_t strlen(const char *str)

返回字符串的长度,不包括空结束字符。

#include <stdio.h>
#include <string.h>

int main() {
    const char str[] = "Hello, world!";
    size_t len = strlen(str);
    
    printf("Length of the string: %ld\n", len);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

17. char *strpbrk(const char *str1, const char *str2)

返回字符串 str1 中第一个匹配字符串 str2 中字符的字符的位置。

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "This is a sample string";
    const char str2[] = "aeiou";
    
    char *result = strpbrk(str1, str2);
    
    if (result != NULL) {
        printf("First vowel found at: %ld\n", result - str1);
    } else {
        printf("No vowels found in the string.\n");
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

18. char *strrchr(const char *str, int c)

返回字符串中最后一次出现字符 c 的位置。

#include <stdio.h>
#include <string.h>

int main() {
    const char str[] = "This is a sample string";
    const char ch = 's';
    const char *result = strrchr(str, ch);
    
    if (result != NULL) {
        printf("'%c' found at position: %ld\n", ch, result - str);
    } else {
        printf("'%c' not found in the string.\n", ch);
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

19. size_t strspn(const char *str1, const char *str2)

返回字符串 str1 中第一个不在字符串 str2 中出现的字符的下标。

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "abcde";
    const char str2[] = "aeiou";
    
    size_t len = strspn(str1, str2);
    
    printf("Length of initial segment containing vowels: %ld\n", len);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

20. char *strstr(const char *haystack, const char *needle)

在字符串 haystack 中查找第一次出现字符串 needle 的位置。

#include <stdio.h>
#include <string.h>

int main() {
    const char haystack[] = "This is a sample string";
    const char needle[] = "sample";
    
    char *result = strstr(haystack, needle);
    
    if (result != NULL) {
        printf("'%s' found at position: %ld\n", needle, result - haystack);
    } else {
        printf("'%s' not found in the string.\n", needle);
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

21. char *strtok(char *str, const char *delim)

分解字符串为一组字符串,使用 delim 作为分隔符。

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "This is a sample string";
    const char delim[] = " ";
    char *token = strtok(str, delim);
    
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

22. size_t strxfrm(char *dest, const char *src, size_t n)

根据当前的区域设置转换字符串 src 的前 n 个字符,并将它们放置在字符串 dest 中。

#include <stdio.h>
#include <string.h>
#include <locale.h>

int main() {
    setlocale(LC_COLLATE, "en_US.utf8");
    
    const char src[] = "banana";
    char dest[20];
    
   

 size_t len = strxfrm(dest, src, sizeof(dest));
    
    printf("Transformed string: %s\n", dest);
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结论

通过本文,我们详细介绍了C语言标准库中<string.h>头文件提供的22个函数,并提供了每个函数的完整示例代码。这些函数在处理字符串和字符数组时非常有用,可以帮助开发人员轻松地进行字符串操作和处理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/136388
推荐阅读
相关标签
  

闽ICP备14008679号