【C语言】库函数-字符串函数

前言

抽个时间整理了一下工作以来用过的比较常用的关于字符串函数,有些也是工作中偶尔遇到,大家有个印象就好。参考菜鸟教程:https://www.runoob.com/

版本迭代

时间版本版本改动
2024.8.22V1.0初始版本
2024.8.24V1.1新增strncasecmp函数、strcasecmp函数

strcpy函数

声明

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

描述

把 src 所指向的字符串复制到 dest中。

参数

  • dest – 指向用于存储复制内容的目标数组。
  • src – 要复制的字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实例

#include <stdio.h>
#include <string.h>
 
int main()
{
   char src[40];
   char dest[100];
  
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is runoob.com");
   strcpy(dest, src);
 
   printf("最终的目标字符串: %s\n", dest);
   
   return(0);
}

结果

最终的目标字符串: This is runoob.com

strncpy函数

声明

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

描述

src所指向的字符串复制到dest,最多复制n个字符。当src的长度小于n时,dest的剩余部分将用空字节填充。

参数

  • dest – 指向用于存储复制内容的目标数组。
  • src – 要复制的字符串。
  • n – 要从源中复制的字符数。

返回值

该函数返回最终复制的字符串。

实例

#include <stdio.h>
#include <string.h>
 
int main()
{
   char src[40];
   char dest[12];
  
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is runoob.com");
   strncpy(dest, src, 10);
 
   printf("最终的目标字符串: %s\n", dest);
   
   return(0);
}

结果

最终的目标字符串: This is ru

strcat函数

声明

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

描述

把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。(它会把dest结尾的\0去除然后再拼接src字符串)

参数

  • dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
  • src – 指向要追加的字符串,该字符串不会覆盖目标字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实例

#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);
}

结果

最终的目标字符串: |This is destinationThis is source|

strncat函数(比较少使用)

声明

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

描述

把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。

参数

  • dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
  • src – 要追加的字符串。
  • n – 要追加的最大字符数。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实例

#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, 15);

   printf("最终的目标字符串: |%s|", dest);
   
   return(0);
}

结果

最终的目标字符串: |This is destinationThis is source|

strcmp函数

声明

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

描述

把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

参数

  • str1 – 要进行比较的第一个字符串。
  • str2 – 要进行比较的第二个字符串。

返回值

该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[15];
   char str2[15];
   int ret;
 
 
   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");
 
   ret = strcmp(str1, str2);
 
   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str1 大于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

结果

str1 大于 str2

strncmp函数

声明

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

描述

用于比较两个字符串的前 n 个字符是否相等。

参数

  • str1 – 要进行比较的第一个字符串。
  • str2 – 要进行比较的第二个字符串。
  • n – 要比较的最大字符数。

返回值

该函数返回值如下:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str1 大于 str2。
  • 如果返回值 = 0,则表示 str1 等于 str2。

实例

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

int main ()
{
   char str1[15];
   char str2[15];
   int ret;


   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strncmp(str1, str2, 4);

   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str2 小于 str1");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

结果

str2 小于 str1

strcasecmp函数

声明

int strcasecmp(const char *s1, const char *s2);

描述

用于比较两个字符串 s1 和 s2,在比较过程中不区分大小写。它逐字符比较两个字符串,直到遇到不同的字符或到达字符串末尾。

参数

  • s1: 指向第一个字符串的指针。
  • s2: 指向第二个字符串的指针。

返回值

  • 如果s1小于s2,返回一个负值。
  • 如果s1大于s2,返回一个正值。
  • 如果s1等于s2,返回 0。

实例

#include <stdio.h>
#include <strings.h>

int main() {
    char *str1 = "Hello";
    char *str2 = "hello";

    int result = strcasecmp(str1, str2);

    if (result == 0) {
        printf("The strings are equal.\n");
    } else if (result < 0) {
        printf("The first string is less than the second string.\n");
    } else {
        printf("The first string is greater than the second string.\n");
    }

    return 0;
}

结果

The strings are equal.

strncasecmp函数

声明

int strncasecmp(const char *s1, const char *s2, size_t n);

描述

比较两个字符串 s1 和 s2,在比较过程中不区分大小写,并且最多比较 n 个字符。(跟上面的strcasecmp用法很像,但是strncasecmp可以自定义比较的字符数n)

参数

  • s1: 指向第一个字符串的指针。
  • s2: 指向第二个字符串的指针。
  • n: 需要比较的最大字符数。

返回值

  • 如果s1小于s2,返回一个负值。
  • 如果s1大于s2,返回一个正值。
  • 如果s1在前n个字符内等于s2,返回 0。

实例

#include <stdio.h>
#include <strings.h>

int main() {
    char *str1 = "HelloWorld";
    char *str2 = "helloworld";
    
    int result = strncasecmp(str1, str2, 5);  // Compare first 5 characters

    if (result == 0) {
        printf("The first 5 characters of the strings are equal.\n");
    } else if (result < 0) {
        printf("The first string is less than the second string in the first 5 characters.\n");
    } else {
        printf("The first string is greater than the second string in the first 5 characters.\n");
    }

    return 0;
}

结果

The first 5 characters of the strings are equal.

strchr函数(比较少使用)

声明

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

描述

用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置。

参数

  • str – 要查找的字符串。
  • c – 要查找的字符。

返回值

如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,如果未找到该字符则返回 NULL。

实例

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

int main ()
{
   const char str[] = "https://www.runoob.com";
   const char ch = 'o';
   char *ptr;

   ptr = strchr(str, ch);

    if (ptr != NULL) {
        printf("字符 'o' 出现的位置为 %ld。\n", ptr - str + 1);
        printf("|%c| 之后的字符串是 - |%s|\n", ch, ptr);
    } else {
        printf("没有找到字符 'o' 。\n");
    }
   return(0);
}

结果

字符 'o' 出现的位置为 16|o| 之后的字符串是 - |oob.com|

strrchr函数(几乎不使用)

声明

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

描述

在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。

参数

  • str – C 字符串。
  • c – 要搜索的字符,通常以整数形式传递(ASCII 值),但是最终会转换回 char 形式。

返回值

strrchr() 函数从字符串的末尾开始向前搜索,直到找到指定的字符或搜索完整个字符串。如果找到字符,它将返回一个指向该字符的指针,否则返回 NULL。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   int len;
   const char str[] = "https://www.runoob.com";
   const char ch = '.';
   char *ret;
 
   ret = strrchr(str, ch);
 
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
   
   return(0);
}

结果

|.| 之后的字符串是 - |.com|

strspn函数(很少用)

声明

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

描述

检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。(个人理解:str2是一个字符列表,str1字符从头开始和str2中的字符列表一个一个对比,如果str1中的字符不在str2的字符列表中,函数结束,返回str1中在str2字符列表中字符的个数)

参数

  • str1 – 要被检索的 C 字符串。
  • str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。

返回值

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

实例

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

int main()
{
	int len1, len2;
	char buffer[] = "25,142,330,Smith,J,239-4123";

	len1 = strspn(buffer, "0123456789");
	len2 = strspn(buffer, ",0123456789");//逗号在str2的字符列表里面

	printf("  len1为:%d;len2为:%d", len1, len2);

	getchar();
	return 0;

}

结果

len1为:2;len2为:11

strcspn函数(没用过)

声明

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

描述

检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。(跟上面的strspn用法相反)

参数

  • str1 – 要被检索的 C 字符串。
  • str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。

返回值

该函数返回 str1 开头连续都不含字符串 str2 中字符的字符数。

实例1

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


int main ()
{
   int len;
   const char str1[] = "ABCDEF4960910";
   const char str2[] = "013";

   len = strcspn(str1, str2);

   printf("第一个匹配的字符是在 %d\n", len + 1);
   
   return(0);
}

结果1

第一个匹配的字符是在 10//str1中的前9个字符都不在str2中,只有第十个字符0在str2的字符列表中。

实例2

参考:https://blog.csdn.net/m0_61629312/article/details/130174730

/* 密码必须包含大小写和特殊字符 */
#include<stdio.h>
#include<string.h>
 
int IsCodeLegal(char* code){
	char* rule1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	char* rule2="abcdefghijklmnopqrstuvwxyz";
	char* rule3="~!@#$%^&*";
	int result_rule1=0,result_rule2=0,result_rule3=0;
	result_rule1=strcspn(rule1,code);
	result_rule2=strcspn(rule2,code);
	result_rule3=strcspn(rule3,code);
	if(result_rule1==26||result_rule2==26||result_rule3==9)
		return 0;
	else
		return 1;
}
 
int main(){
	char* code1="1234567890";
	char* code2="123@Ab27418";
	printf("%s,%s\n",code1,IsCodeLegal(code1)?"合法":"不合法");
	printf("%s,%s\n",code2,IsCodeLegal(code2)?"合法":"不合法");
}

结果2

1234567890,不合法
123@Ab27418,合法

strpbrk函数(很少用)

声明

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

描述

检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。

参数

  • str1 – 要被检索的 C 字符串。
  • str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。

返回值

该函数返回 str1 中第一个匹配字符串 str2 中字符的字符数,如果未找到字符则返回 NULL。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   const char str1[] = "abcde2fghi3jk4l";
   const char str2[] = "34";
   char *ret;
 
   ret = strpbrk(str1, str2);
   if(ret) 
   {
      printf("第一个匹配的字符是: %c\n", *ret);
   }
   else 
   {
      printf("未找到字符");
   }
   
   return(0);
}

结果

第一个匹配的字符是: 3

strstr函数

声明

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

描述

在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。

参数

  • haystack – 要被检索的 C 字符串。
  • needle – 在 haystack 字符串内要搜索的小字符串。

返回值

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

实例

#include <stdio.h>
#include <string.h>
 
 
int main()
{
   const char haystack[20] = "RUNOOB";
   const char needle[10] = "NOOB";
   char *ret;
 
   ret = strstr(haystack, needle);
 
   printf("子字符串是: %s\n", ret);
   
   return(0);
}

结果

子字符串是: NOOB

strlen函数

声明

size_t strlen(const char *str)

描述

计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

参数

  • str – 要计算长度的字符串。

返回值

该函数返回字符串的长度。

实例

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

int main ()
{
   char str[50];
   int len;

   strcpy(str, "This is runoob.com");

   len = strlen(str);
   printf("|%s| 的长度是 |%d|\n", str, len);
   
   return(0);
}

结果

|This is runoob.com| 的长度是 |18|

strtok函数

声明

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

描述

分解字符串 str 为一组字符串,delim 为分隔符。

参数

  • str – 要被分解成一组小字符串的字符串。
  • delim – 包含分隔符的 C 字符串。

返回值

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

实例

#include <string.h>
#include <stdio.h>
 
int main () {
   char str[80] = "This is - www.runoob.com - website";
   const char s[2] = "-";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return(0);
}

结果

This is 
 www.runoob.com 
 website

strsep函数

声明

char *strsep(char **stringp, const char *delim);

描述

strsep 函数用于分割字符串。它查找由 delim 字符串参数指定的分隔符集,在 *stringp 指向的字符串中找到第一个这样的分隔符,并将其替换为 NULL 字符(‘\0’),从而分割字符串。然后,strsep 更新 *stringp 指针以指向下一个分割后的字符串(如果存在的话),并返回指向当前分割出的字符串的指针。如果 *stringp 是 NULL,则 strsep 返回 NULL。

参数

  • char **stringp:指向字符指针的指针,该指针指向要分割的字符串。在每次函数调用后,*stringp 会被更新为指向下一个分割后的字符串(如果有的话)。
  • const char *delim:指向分隔符字符串的指针,strsep 会在 *stringp 指向的字符串中查找这些分隔符来分割字符串。

返回值

  • 返回一个指向当前分割出的字符串的指针。如果 *stringp 是 NULL,则返回 NULL。

实例

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char text[] = "apple,banana,cherry";  
    char *token;  
    char *saveptr;  
  
    // saveptr 用于存储 text 的原始地址,以便 strsep 更新 text 指针  
    saveptr = text;  
  
    // 循环分割字符串  
    while ((token = strsep(&saveptr, ",")) != NULL) {  
        printf("%s\n", token);  
    }  
  
    return 0;  
}

结果

apple
banana
cherry

strdup函数

声明

char *strdup(const char *s);

描述

strdup 函数用于创建一个新的字符串,该字符串是参数 s 所指向的字符串的一个副本(包括终止的空字符 ‘\0’)。分配给新字符串的内存来自于 malloc,因此,调用者负责在适当的时候使用 free 来释放这块内存,以避免内存泄漏。

参数

  • const char *s:指向要复制的源字符串的指针。

返回值

  • 返回一个指向新分配的字符串的指针,该字符串是 s 的副本。如果内存分配失败,则返回 NULL。

实例

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
int main() {  
    const char *original = "Hello, World!";  
    char *copy;  
  
    // 使用 strdup 复制字符串  
    copy = strdup(original);  
    if (copy != NULL) {  
        printf("Original: %s\n", original);  
        printf("Copy: %s\n", copy);  
  
        // 使用完毕后释放内存  
        free(copy);  
    } else {  
        printf("Memory allocation failed!\n");  
    }  
  
    return 0;  
}

结果

Original: Hello, World!  
Copy: Hello, World!

memcpy函数

声明

void *memcpy(void *str1, const void *str2, size_t n)

描述

从存储区 str2 复制 n 个字节到存储区 str1

参数

  • str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
  • n – 要被复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

实例

// 将字符串复制到数组 dest 中
#include <stdio.h>
#include <string.h>
 
int main ()
{
   const char src[50] = "http://www.runoob.com";
   char dest[50];
 
   memcpy(dest, src, strlen(src)+1);
   printf("dest = %s\n", dest);
   
   return(0);
}

结果

dest = http://www.runoob.com

memmove函数

声明

void *memmove(void *str1, const void *str2, size_t n)

描述

从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

参数

  • str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
  • n – 要被复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

实例

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

int main ()
{
   const char dest[] = "oldstring";
   const char src[]  = "newstring";

   printf("Before memmove dest = %s, src = %s\n", dest, src);
   memmove(dest, src, 9);
   printf("After memmove dest = %s, src = %s\n", dest, src);

   return(0);
}

结果

Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring

memcmp函数

声明

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

描述

把存储区 str1 和存储区 str2 的前 n 个字节进行比较。

参数

  • str1 – 指向内存块的指针。
  • str2 – 指向内存块的指针。
  • n – 要被比较的字节数。

返回值

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str1 大于 str2。
  • 如果返回值 = 0,则表示 str1 等于 str2。

实例

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

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   memcpy(str1, "abcdef", 6);
   memcpy(str2, "ABCDEF", 6);

   ret = memcmp(str1, str2, 5);

   if(ret > 0)
   {
      printf("str2 小于 str1");
   }
   else if(ret < 0) 
   {
      printf("str1 小于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

结果

str2 小于 str1

memchr函数

声明

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

描述

在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。

参数

  • str – 指向要执行搜索的内存块。
  • c – 以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
  • n – 要被分析的字节数。

返回值

该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   const char str[] = "http://www.runoob.com";
   const char ch = '.';
   char *ret;
 
   ret = (char*)memchr(str, ch, strlen(str));
 
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
 
   return(0);
}

结果

|.| 之后的字符串是 - |.runoob.com|

memset函数

声明

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

描述

用于将一段内存区域设置为指定的值。

memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。

在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。

在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。

参数

  • str – 指向要填充的内存区域的指针。
  • c – 要设置的值,通常是一个无符号字符。
  • n – 要被设置为该值的字节数。

返回值

该值返回一个指向存储区 str 的指针。

注意事项

  • memset() 并不对指针 ptr 指向的内存区域做边界检查,因此使用时需要确保 ptr 指向的内存区域足够大,避免发生越界访问。
  • memset() 的第二个参数 value 通常是一个 int 类型的值,但实际上只使用了该值的低8位。这意味着在范围 0 到 255 之外的其他值可能会产生未定义的行为。
  • num 参数表示要设置的字节数,通常是通过 sizeof() 或其他手段计算得到的。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}

结果

This is string.h library function
$$$$$$$ string.h library function

总结

工作之余总结的笔记难免可能有些错误,如果有问题可以留言我改正。有遇到新的字符串处理函数我也会抽空添加。end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Nebula嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值