C语言实例_string.h库函数功能及其用法详解

一、前言

在计算机编程中,字符串处理是一项常见而重要的任务。C语言的string.h头文件提供了一系列函数和工具,用于对字符串进行操作和处理。这些函数包括字符串复制、连接、比较、查找等功能,为开发人员提供了强大的字符串处理能力。本文将对string.h头文件中的所有函数进行全面介绍,包括它们的功能和使用方法,以帮助大家更好地理解和利用该头文件。

二、函数介绍

下面是对每个函数的详细介绍及其功能。

【1】strlen(const char *str)

  • 功能:计算字符串的长度,即字符串中字符的个数,不包括字符串结束符'\0'。
  • 返回值:无符号整数,表示字符串的长度。

【2】strcpy(char *dest, const char *src)

  • 功能:将源字符串复制到目标字符串中,包括字符串结束符'\0'。
  • 返回值:指向目标字符串的指针。

【3】strncpy(char *dest, const char *src, size_t n)

  • 功能:将源字符串的前n个字符复制到目标字符串中,包括字符串结束符'\0'。如果源字符串长度不足n,则在目标字符串末尾填充'\0'。
  • 返回值:指向目标字符串的指针。

【4】strcat(char *dest, const char *src)

  • 功能:将源字符串连接到目标字符串的末尾,包括字符串结束符'\0'。
  • 返回值:指向目标字符串的指针。

【5】strncat(char *dest, const char *src, size_t n)

  • 功能:将源字符串的前n个字符连接到目标字符串的末尾,包括字符串结束符'\0'。如果源字符串长度不足n,则在目标字符串末尾填充'\0'。
  • 返回值:指向目标字符串的指针。

【6】strcmp(const char *str1, const char *str2)

  • 功能:比较两个字符串的大小关系。
  • 返回值:整数值,当str1小于str2时返回负数,当str1等于str2时返回0,当str1大于str2时返回正数。

【7】strncmp(const char *str1, const char *str2, size_t n)

  • 功能:比较两个字符串的前n个字符的大小关系。
  • 返回值:整数值,当str1小于str2时返回负数,当str1等于str2时返回0,当str1大于str2时返回正数。

【8】strchr(const char *str, int c)

  • 功能:在字符串中查找第一次出现指定字符c的位置。
  • 返回值:指向第一次出现指定字符的指针,如果未找到则返回NULL。

【9】strrchr(const char *str, int c)

  • 功能:在字符串中查找最后一次出现指定字符c的位置。
  • 返回值:指向最后一次出现指定字符的指针,如果未找到则返回NULL。

【10】strstr(const char *haystack, const char *needle)

  • 功能:在字符串haystack中查找第一次出现子字符串needle的位置。
  • 返回值:指向第一次出现子字符串的指针,如果未找到则返回NULL。

【11】strtok(char *str, const char *delim)

  • 功能:将字符串分割为一系列子字符串,使用delim中的字符作为分隔符。
  • 返回值:指向分割得到的子字符串的指针,如果字符串已经被完全分割,则返回NULL。

【12】memset(void *ptr, int value, size_t num)

  • 功能:将指定的内存块(由ptr指向)的前num个字节都设置为特定值value。
  • 返回值:指向内存块的指针。

【13】memcpy(void *dest, const void *src, size_t num)

  • 功能:将源内存块(由src指向)的前num个字节复制到目标内存块(由dest指向)中。
  • 返回值:指向目标内存块的指针。

【14】memmove(void *dest, const void *src, size_t num)

  • 功能:将源内存块(由src指向)的前num个字节复制到目标内存块(由dest指向)中,可以处理内存块的重叠。
  • 返回值:指向目标内存由于回答的字符数限制,无法一次性提供完整的函数介绍。以下是续写部分:

【15】memcmp(const void *ptr1, const void *ptr2, size_t num)

  • 功能:比较两个内存块的前num个字节的大小关系。
  • 返回值:整数值,当ptr1小于ptr2时返回负数,当ptr1等于ptr2时返回0,当ptr1大于ptr2时返回正数。

【16】memchr(const void *ptr, int value, size_t num)

  • 功能:在内存块中查找第一次出现指定值value的位置。
  • 返回值:指向第一次出现指定值的指针,如果未找到则返回NULL。

【17】memmove_s(void *dest, rsize_t destsz, const void *src, rsize_t count)

  • 功能:将源内存块(由src指向)的前count个字节复制到目标内存块(由dest指向)中,可以处理内存块的重叠。确保目标内存块的大小为destsz。
  • 返回值:错误码,0表示成功,非零值表示失败。

三、代码示例

以下是对每个函数的用法示例:

【1】strlen(const char *str):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    const char *str = "Hello, world!";
    int length = strlen(str);
    printf("The length of the string is: %d\n", length);
    return 0;
}

【2】strcpy(char *dest, const char *src):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    char dest[20];
    const char *src = "Hello, world!";
    strcpy(dest, src);
    printf("The copied string is: %s\n", dest);
    return 0;
}

【3】strncpy(char *dest, const char *src, size_t n):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    char dest[20];
    const char *src = "Hello, world!";
    strncpy(dest, src, 5);
    dest[5] = '\0';  // Ensure null-termination
    printf("The copied string is: %s\n", dest);
    return 0;
}

【4】strcat(char *dest, const char *src):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    char dest[20] = "Hello";
    const char *src = ", world!";
    strcat(dest, src);
    printf("The concatenated string is: %s\n", dest);
    return 0;
}

【5】strncat(char *dest, const char *src, size_t n):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    char dest[20] = "Hello";
    const char *src = ", world!";
    strncat(dest, src, 3);
    dest[8] = '\0';  // Ensure null-termination
    printf("The concatenated string is: %s\n", dest);
    return 0;
}

【6】strcmp(const char *str1, const char *str2):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    const char *str1 = "apple";
    const char *str2 = "banana";
    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;
}

【7】strncmp(const char *str1, const char *str2, size_t n):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    const char *str1 = "apple";
    const char *str2 = "application";
    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;
}

【8】strchr(const char *str, int c):

cpp 复制代码
#include <stdio.h>
#include <string.h>
​
int main() {
    const char *str = "Hello, world!";
    char *ptr = strchr(str, 'o');
    if (ptr != NULL) {
        printf("The first occurrence of 'o' is at index: %ld\n", ptr - str);
    } else {
        printf("The character 'o' is not found\n");
    }
    return 0;
}

【9】strrchr(const char *str, int c):

arduino 复制代码
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, world!";
    char *ptr = strrchr(str, 'o');
    if (ptr != NULL) {
        printf("The last occurrence of 'o' is at index: %ld\n", ptr - str);
    } else {
        printf("The character 'o' is not found\n");
    }
    return 0;
}

【10】strstr(const char *haystack, const char *needle):

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main() {
    const char *haystack = "Hello, world!";
    const char *needle = "world";
    char *ptr = strstr(haystack, needle);
    if (ptr != NULL) {
        printf("The substring '%s' is found at index: %ld\n", needle, ptr - haystack);
    } else {
        printf("The substring '%s' is not found\n", needle);
    }
    return 0;
}
相关推荐
codigger1 小时前
Java 26 深度解析:一次“性能兑现 + 契约收紧”的版本
java·后端·编程·编程语言
盖世英雄酱581361 小时前
格式化成日期为什么提前一天呢,同样的时间点还是非必现???
java·后端
威哥爱编程1 小时前
【AI全栈12-05】Spring Boot 用 Tool Calling 让 AI 查实时订单与库存
java·spring boot·后端
用户298698530141 小时前
Python 实战:将 HTML 内容保存为图像文件
后端·python·html
挖掘狂人1 小时前
Java 26 深度解析:一次“性能兑现 + 契约收紧”的版本
javascript·后端·性能优化
威哥爱编程1 小时前
【AI全栈12-06】Spring Boot 用 RAG 搭企业私有知识库问答
java·spring boot·后端
小蒜学长1 小时前
基于微信小程序的医院医疗废弃物追溯管理系统(代码+数据库+LW)
java·spring boot·后端·微信小程序·医疗废弃物
掘金者阿豪1 小时前
SQL 编辑器技术实践:从写 SQL 到数据库治理,聊聊电科金仓 KSQL Developer 的实际价值
后端
威哥爱编程1 小时前
【AI全栈12-04】Spring Boot 用结构化输出自动解析简历:让模型按你的 POJO 输出
java·spring boot·后端
StackTraces1 小时前
从零跑通 Meilisearch 本地搜索服务:6 步,外加 4 个容易卡住的地方
数据库·后端