<string.h>头文件: C 语言字符串处理函数详解

本文详细介绍了C语言标准库中string.h头文件中的各种字符串处理函数,如strset、strrev、memset、strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp、strchr、strrchr、strstr和strtok,以及它们各自的功能和使用示例。


引言

string.h 是 C 语言标准库中的头文件,主要用于处理字符串(character strings)的操作。该头文件中包含了一系列字符串处理的函数原型,这些函数在处理字符串时非常有用。下面是一些常见的 string.h 中的函数及其功能:

函数

strset():

  • 功能:将一个字符串中的所有字符都设为指定字符
  • 原型: char *strset(char *str, char c);
#include <stdio.h>
#include <string.h>

int main(void)
{
   char string[20] = "d0ublecl1ck";
   char symbol = 'c';

   printf("Before strset(): %s\n", string);
   strset(string, symbol);
   printf("After strset():  %s\n", string);
   return 0;
}

Before strset(): d0ublecl1ck
After strset():  ccccccccccc

这里要和memset进行区分,下面是memset的类似案例,用作区分。

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

int main(void) {
	char string[20] = "d0ublecl1ck";
	char symbol = 'c';

	printf("Before memset(): %s\n", string);

	memset(string,symbol,sizeof(string));
	printf("After memset():  %s\n", string);
	return 0;
}
Before memset(): d0ublecl1ck
After memset():  cccccccccccccccccccc

strrev():

  • 功能:将字符串中的字符全部颠倒顺序,重新排序
  • 原型:char *strrev(char *str);
#include<string.h>
#include<stdio.h>
 
int main(void){
 
   char forward[20] = "d0ublecl1ck";
 
   printf("Before strrev(): %s\n", forward);
 
   strrev(forward);
 
   printf("After strrev(): %s\n", forward);
 
   return 0;
 
}
Before strrev(): d0ublecl1ck
After strrev(): kc1lcelbu0d

memset():

  • 功能:用于将一段内存块的内容设置为特定的值
  • 原型:void *memset(void *ptr, int value, size_t num);
  • ptr 是指向要设置的内存块的指针。
  • value 是要设置的值,以 int 类型表示。
  • num 是要设置的字节数。
#include <stdio.h>
#include <string.h>

int main() {
    char str[20];

    // 使用memset将str数组的内容设置为字符 'A'
    memset(str, 'A', sizeof(str));

    // 打印设置后的结果
    printf("After memset: %s\n", str);

    return 0;
}

After memset: AAAAAAAAAAAAAAAAAAAA

值得一提的是memset是根据字节来设置内容,所以一般不用于整型等多字节数据类型。

strlen():

  • 功能:计算字符串的长度,即不包括字符串末尾的空字符(‘\0’)的字符个数。
  • 原型:size_t strlen(const char *str);
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    size_t length = strlen(str);

    printf("字符串的长度:%zu\n", length);

    return 0;
}
字符串的长度:13

%zu 是 C 语言中用于格式化输出的格式指示符之一。它用于打印 size_t 类型的变量的值。在你的代码中,size_t 类型用于存储字符串的长度。
printf 函数中,%zu 用于指示将要输出的是一个 size_t 类型的值。这是为了保证跨平台的兼容性,因为 size_t 类型的大小在不同的操作系统和编译器中可能会有所不同。

strcpy():

  • 功能:复制一个字符串到另一个字符串。
  • 原型:char *strcpy(char *dest, const char *src);
#include <stdio.h>
#include <string.h>

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

    strcpy(dest, src);

    printf("复制的字符串: %s\n", dest);

    return 0;
}
复制的字符串: Hello, World!

strncpy():

  • 功能:从源字符串复制指定数量的字符到目标字符串。
  • 原型:char *strncpy(char *dest, const char *src, size_t n);
#include <stdio.h>
#include <string.h>

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

    strncpy(dest, src, 5); // 复制前5个字符

    printf("复制的字符串:%s\n", dest);

    return 0;
}
复制的字符串:Hello

strcat():

  • 功能:将一个字符串追加到另一个字符串的末尾。
  • 原型:char *strcat(char *dest, const char *src);
#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;
}
连接后的字符串: Hello, World!

strncat():

  • 功能:将一个字符串的指定数量的字符追加到另一个字符串的末尾。
  • 原型:char *strncat(char *dest, const char *src, size_t n);
#include <stdio.h>
#include <string.h>

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

    strncat(dest, src, 3); // Concatenate first 3 characters of src

    printf("连接后的字符串: %s\n", dest);

    return 0;
}
连接后的字符串: Hello, Wor

strcmp():

  • 功能:比较两个字符串。
  • 原型:int strcmp(const char *str1, const char *str2);
#include <stdio.h>
#include <string.h>

int main() {
    const char *str1 = "你好";
    const char *str2 = "你好吗";

    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("字符串相等\n");
    } else if (result < 0) {
        printf("字符串1小于字符串2\n");
    } else {
        printf("字符串1大于字符串2\n");
    }

    return 0;
}
字符串1小于字符串2

strncmp():

  • 功能:比较两个字符串的前 n 个字符。
  • 原型:int strncmp(const char *str1, const char *str2, size_t n);
#include <stdio.h>
#include <string.h>

int main() {
    const char *str1 = "你好";
    const char *str2 = "你好吗";

    int result = strncmp(str1, str2, 2); // 比较前2个字符

    if (result == 0) {
        printf("字符串前2个字符相等\n");
    } else if (result < 0) {
        printf("字符串1前2个字符小于字符串2前2个字符\n");
    } else {
        printf("字符串1前2个字符大于字符串2前2个字符\n");
    }

    return 0;
}
字符串前2个字符相等

strchr():

  • 功能:在字符串中查找特定字符的第一次出现。
  • 原型:char *strchr(const char *str, int c);
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    char target = 'o';

    char *result = strchr(str, target);

    if (result != NULL) {
        printf("字符 '%c' 第一次出现的位置:%ld\n", target, result - str);
    } else {
        printf("字符 '%c' 未找到\n", target);
    } 
    // result得到第一个o的地址
    // result - str 计算出地址差值,就是第一次出现的位置
    return 0;
}

字符 'o' 第一次出现的位置:4

strrchr():

  • 功能:在字符串中查找特定字符的最后一次出现。
  • 原型:char *strrchr(const char *str, int c);
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    char target = 'o';

    char *result = strrchr(str, target);

    if (result != NULL) {
        printf("字符 '%c' 最后一次出现的位置:%ld\n", target, result - str);
    } else {
        printf("字符 '%c' 未找到\n", target);
    }
    // result得到最后一个o的地址
    // result - str 计算出地址差值,就是最后一次出现的位置
    return 0;
}

字符 'o' 最后一次出现的位置:8

strstr():

  • 功能:在字符串中查找子串的第一次出现。
  • 原型:char *strstr(const char *haystack, const char *needle);
#include <stdio.h>
#include <string.h>

int main() {
    const char *haystack = "Hello, World!";
    const char *needle = "World";

    char *result = strstr(haystack, needle);

    if (result != NULL) {
        printf("子串 '%s' 第一次出现的位置:%ld\n", needle, result - haystack);
    } else {
        printf("子串 '%s' 未找到\n", needle);
    }
 	// result 得到子串的地址
    // result - haystack 计算出地址差值,就是子串出现的位置
    return 0;
}

子串 'World' 第一次出现的位置:7

strtok():

  • 功能:将字符串拆分切分。
  • 原型:char *strtok(char *str, const char *delimiters);
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello,World,everyone";
    const char *delimiters = ",";

    char *token = strtok(str, delimiters);

    while (token != NULL) {
        printf("切分:%s\n", token);
        token = strtok(NULL, delimiters);
    }

    return 0;
}


切分:Hello
切分:World
切分:everyone

这些函数为字符串的操作提供了基本的功能,从复制和连接到比较和搜索。使用这些函数时,请确保在处理字符串时不会越界,以避免不确定的行为。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

d0ublecl1ck_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值