C语言库函数 — 字符串函数(含模拟实现字符串函数)

简介: C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串 中或者 字符数组中。字符串常量适用于那些对它不做修改的字符串函数。在使用字符串库函数时,需要加上头文件<string.h> ,即在程序开头加上#include<string.h>函数介绍strlen函数 是C语言标准库函数之一,其功能是计算一个以NULL结尾的字符串的长度。

前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串 中或者 字符数组中。字符串常量适用于那些对它不做修改的字符串函数。

在使用字符串库函数时,需要加上头文件 ,即在程序开头加上#include

在本期博客中介绍常用到的字符串函数模拟实现相对应的字符串函数


文章目录

前言

一、求字符串长度函数

strlen

函数介绍

模拟实现strlen函数

二、长度不受限制的字符串函数

strcpy

函数介绍

模拟实现strcpy函数

strcat

函数介绍

模拟实现strcat函数

strcmp

函数介绍

模拟实现strcmp函数

三、长度受限制的字符串函数

strncpy

strncat

strncmp

四、字符串查找函数

strstr

函数介绍

模拟实现strstr函数

strtok

函数介绍

模拟实现strtok函数

五、字符分类函数

常见的字符分类函数

六、字符转换函数(大小写转换)

常见的字符转换函数

七、总结


一、求字符串长度函数


strlen


函数介绍

strlen函数 是C语言标准库函数之一,其功能是计算一个以NULL结尾的字符串的长度。

函数原型:

size_t strlen(const char *str);

其中,参数str是指向待计算长度的字符串的指针,返回值是字符串的长度,不包括NULL结尾符。如果字符串为空,则返回0。

概述要点:

1. 字符串已经 ’ \0 ’ 作为结束标志,strlen函数返回的是在字符串中 ’ \0 ’ 前面出现的字符个数(不包 含 ’ \0 ’ )

2. 参数指向的字符串必须要以 ’ \0 ’ 结束

3. 注意函数的返回值为size_t,是无符号的

演示代码:

#include<stdio.h>
#include<string.h>
int main()
{
  char arr[] = "abcdef";
  int ret = strlen(arr);
  printf("%d", ret);
  return 0;
}

模拟实现strlen函数

#include<stdio.h>
int my_strlen(char* str)
{
  int count = 0;
  while (*str)
  {
    str++;
    count++;
  }
  return count;
}
int main()
{
  char arr[] = "abcdef";
  int ret = my_strlen(arr);
  printf("%d", ret);
  return 0;
}

二、长度不受限制的字符串函数

长度不受限制的字符串函数是指在处理字符串时,没有限制字符串的长度,可以处理非常长的字符串。 这样的函数通常会使用动态分配内存的技术来增加字符串的长度,以避免内存不足或溢出的情况。一些常见的长度不受限制的字符串函数包括 strcatstrcpystrlen 等等。这些函数在 C 语言和许多其他编程语言中都有提供。


strcpy


函数介绍

strcpy函数是C语言标准库函数之一,其功能是将一个字符串复制到另一个字符串中。

函数原型:

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

其中,dest是目标字符串的指针,src是源字符串的指针,函数返回指向目标字符串的指针。


strcpy函数将源字符串中的字符逐个复制到目标字符串中,直到遇到NULL结束符,包括NULL。如果源字符串的长度大于目标字符串的长度,会发生缓冲区溢出,导致不可预料的后果。因此,在使用strcpy函数时需要对目标字符串的长度进行控制。


概述要点:

1. 源字符串必须以 ‘\0’ 结束。

2. 会将源字符串中的 ‘\0’ 拷贝到目标空间。

3. 目标空间必须足够大,以确保能存放源字符串。

4. 目标空间必须可变

演示代码:

int main()
{
    char arr1[20];
  char arr2[] = "hello world";
  strcpy(arr1,arr2);
  printf( "%s", arr1);
  return 0;
}

模拟实现strcpy函数

#include<stdio.h>
char* my_strcpy(char* str, const char* dse)
{
  char* ret = str;
  while (*dse)
  {
    *str = *dse;
    str++;
    dse++;
  }
  return str;
}
int main()
{
    char arr1[20];
  char arr2[] = "hello world";
  my_strcpy(arr1,arr2);
  printf( "%s", arr1);
  return 0;
}

strcat


函数介绍

strcat函数是C语言标准库函数之一,其功能是将一个字符串追加到另一个字符串的末尾。

函数原型:

char*strcat(char*dest, constchar*src);

其中,dest是目标字符串的指针,src是源字符串的指针,函数返回指向目标字符串的指针。


strcat函数将源字符串中的字符逐个复制到目标字符串中,直到遇到NULL结束符,然后将追加上去的源字符串的NULL结束符跟在目标字符串的结尾处。如果目标字符串的长度不足以容纳源字符串,会发生缓冲区溢出,导致不可预料的后果。因此,在使用strcat函数时需要对目标字符串的长度进行控制。


概述要点:


1. 源字符串必须以 ‘\0’ 结束。

2. 目标空间必须有足够的大,能容纳下源字符串的内容。

3. 目标空间必须可修改。


演示代码:

intmain()
{
chararr1[10] ="abbc";
chararr2[5] ="abc";
strcat(arr1, arr2);
printf("%s", arr1);
return0;
}

模拟实现strcat函数

#include<stdio.h>char*my_strcat(char*dest, constchar*src)
{
char*ret=dest;
while (*dest)
    {
dest++;
    }
while ((*dest++=*src++))
    {
        ;
    }
returnret;
}
intmain()
{
chararr1[10] ="abbc";
chararr2[5] ="abc";
my_strcat(arr1, arr2);
printf("%s", arr1);
return0;
}

strcmp


函数介绍

strcmp函数是C语言标准库函数之一,用于比较两个字符串是否相等。

函数原型:

intstrcmp(constchar*str1, constchar*str2);

其中,str1和str2是要比较的两个字符串,函数返回两个字符串的比较结果。


函数执行过程中,会从两个字符串的第一个字符开始逐个比较,直到发现不相同的字符或到达字符串末尾。如果两个字符串在从左到右的过程中第一个不同字符是在str1中出现的,则返回一个负数;如果第一个不同字符位于str2中,则返回一个正数;如果两个字符串完全相同,则返回0。


函数标准规定:

1. 第一个字符串大于第二个字符串,则返回大于0的数字

2. 第一个字符串等于第二个字符串,则返回0

3. 第一个字符串小于第二个字符串,则返回小于0的数字


演示代码:

例如,以下代码比较两个字符串是否相等:

charstr1[] ="hello";
charstr2[] ="world";
intresult=strcmp(str1, str2);
if (result==0) {
printf("两个字符串相等");
} elseif (result<0) {
printf("str1小于str2");
} else {
printf("str1大于str2");
}

执行完毕后,输出结果为"str1小于str2"。


模拟实现strcmp函数

#include<stdio.h>intmy_strcmp(constchar*src, constchar*dst)
{
intret=0;
while (!(ret=*(unsignedchar*)src-*(unsignedchar*)dst) &&*dst)
++src, ++dst;
if (ret<0)
ret=-1;
elseif (ret>0)
ret=1;
return(ret);
}
intmain()
{
chararr1[10] ="abb";
chararr2[5] ="abc";
intresult=my_strcmp(arr1, arr2);
if (result==0) {
printf("两个字符串相等");
    }
elseif (result<0) {
printf("arr1小于arr2");
    }
else {
printf("arr1大于arr2");
    }
return0;
}

三、长度受限制的字符串函数

长度受限制的字符串函数指的是操作字符串时设定了一定的长度限制。 这种函数可以确保在字符串长度超过限制时不会导致缓冲区溢出或内存泄漏等问题。常见的长度受限制的字符串函数包括 strncpy()、strlcpy()、strcat()、strncat() 等。这些函数在操作字符串时需要指定目标字符串的长度,以确保操作不会超出设定的长度限制。


strncpy

strncpy函数是C语言标准库函数之一,用于将一个字符串的一部分复制到另一个字符串中。

函数原型:

char*strncpy(char*dest, constchar*src, size_tn);

其中,dest是目标字符串,src是源字符串,n表示复制的最大字符数。


函数将src字符串的前n个字符复制到dest字符串中,如果src字符串不够n个字符,则会在dest字符串后面加上’\0’字符,直到复制的字符数总共为n个。如果src字符串大于等于n个字符,则dest字符串不会被自动添加’\0’字符。


需要注意的是,如果src字符串的长度小于n,则dest字符串后面可能包含一些未定义的字符。


演示代码:

以下是一个例子,将src字符串的前5个字符复制到dest字符串中:

charsrc[] ="hello world";
chardest[6];
strncpy(dest, src, 5);
dest[5] ='\0';
printf("dest: %s\n", dest);

执行完毕后,输出结果为"hello"。需要注意的是,在将src字符串的前五个字符复制到dest字符串中后,由于dest字符串没有以’\0’结尾,因此需要手动添加。


strncat

strncat函数用于将一个字符串的前n个字符拼接到另一个字符串的末尾。该函数定义在头文件中。


函数的原型:

char*strncat(char*dest, constchar*src, size_tn);

函数参数说明:

dest:目标字符串,表示将要拼接的字符串的末尾。

src:源字符串,表示要拼接的字符串。

n:拼接的最大长度。


函数返回值说明:

  • 返回目标字符串的地址。


演示代码:

#include <stdio.h>#include <string.h>intmain()
{
charstr1[20] ="hello";
charstr2[] ="world";
strncat(str1, str2, 3);
printf("%s\n", str1); // 输出结果为"helloworld"return0;
}

运行结果为"helloworld"。


strncmp

strncmp函数是一个字符串比较函数,它用于比较两个字符串的前n个字符是否相等。

函数原型:

intstrncmp(constchar*str1, constchar*str2, size_tn);

其中,str1str2是要比较的两个字符串,n表示要比较的字符数。


函数返回值:

str1str2 的前 n个字符相等时,返回 0。

str1 的前 n 个字符大于 str2 的前 n 个字符时,返回一个正整数。

str1 的前 n 个字符小于 str2 的前 n个字符时,返回一个负整数。


演示代码:

#include <stdio.h>#include <string.h>intmain()
{
charstr1[] ="Hello, world";
charstr2[] ="Hello, there";
intresult;
result=strncmp(str1, str2, 6);
printf("%d\n", result); // 输出 0result=strncmp(str1, str2, 7);
printf("%d\n", result); // 输出 -32return0;
}

在以上示例中,第一个strncmp 函数比较两个字符串的前6个字符,由于两个字符串的前6个字符相等,因此返回值为0。第二个 strncmp 函数比较两个字符串的前7个字符,发现第一个字符串的第7个字符(,)的ASCII码(44)小于第二个字符串的第7个字符(t)的ASCII码(116),因此返回值为一个负整数。


四、字符串查找函数

字符串查找函数是一些程序库中提供的函数,它们用于在一个字符串中查找是否包含另一个字符串,并返回第一次出现的位置。 在编程中,这些函数非常有用,因为它们可以帮助程序员在一个字符串中快速定位特定的子字符串或字符。常见的字符串查找函数包括C语言中的strstr函数

strstr


函数介绍

strstr函数是C语言中的一个字符串处理函数,其主要功能是在一个字符串中查找另一个字符串的子串,如果找到,则返回该子串在原字符串中首次出现的位置;如果未找到,则返回NULL。


函数原型:

char*strstr(constchar*haystack, constchar*needle);

其中haystack为要查找的字符串,needle为要查找的子串。函数返回值为指向该子串在haystack中第一次出现的位置的指针,如果未找到则返回NULL。


概述要点:


其主要功能是在一个字符串中查找另一个字符串的子串,如果找到,则返回该子串在原字符串中首次出现的位置;如果未找到,则返回NULL。

strstr函数区分大小写。如果需要不区分大小写的查找,可以使用strcasestr函数。


演示代码:

#include <stdio.h>#include <string.h>intmain()
{
charstr[] ="This is a simple string";
char*pch;
pch=strstr(str, "simple");
puts(pch);
return0;
}

模拟实现strstr函数

#include <stdio.h>#include <string.h>char*my_strstr(constchar*str1, constchar*str2)
{
char*cp= (char*)str1;
char*s1, *s2;
if (!*str2)
return((char*)str1);
while (*cp)
    {
s1=cp;
s2= (char*)str2;
while (*s1&&*s2&&!(*s1-*s2))
s1++, s2++;
if (!*s2)
return(cp);
cp++;
    }
return(NULL);
}
intmain()
{
charstr[] ="This is a simple string";
char*pch;
pch=my_strstr(str, "simple");
puts(pch);
return0;
}

strtok


函数介绍

strtok函数是C语言字符串处理函数之一,用于将一个字符串分割成一段一段的小字符串。


函数原型:

char*strtok ( char*str, constchar*sep );

其中,str是要分割的字符串,sep则是用来指定分割位置的分隔符。开发者可以连续调用strtok函数来分割同一个字符串,直到字符串被完全分割成为止。每次调用strtok函数都会返回分割后的小字符串,如果没有可分割的字符串则返回NULL。注意:strtok函数是有副作用的,它会修改输入的字符串,所以在使用时应该小心。


概述要点:


  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。


演示代码:

#include <stdio.h>#include <string.h>intmain()
{
char*p="hello@word.666";
constchar*sep=".@";
chararr[30];
char*str=NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容for (str=strtok(arr, sep); str!=NULL; str=strtok(NULL, sep))
    {
printf("%s\n", str);//输出 hello word 666    }
}

模拟实现strtok函数

下面是用C语言模拟实现strtok函数的示例代码:

#include <stdio.h>#include <string.h>char*my_strtok(char*str, constchar*delim)
{
staticchar*p=NULL;
if (str!=NULL)
    {
p=str;
    }
elseif (p==NULL)
    {
returnNULL;
    }
char*ret=p;
while (*p!='\0')
    {
constchar*q=delim;
while (*q!='\0')
        {
if (*p==*q)
            {
*p='\0';
p++;
if (*ret!='\0')
                {
returnret;
                }
else                {
ret=p;
break;
                }
            }
q++;
        }
if (*ret=='\0')
        {
ret++;
        }
elseif (*p!='\0')
        {
p++;
        }
    }
p=NULL;
returnret;
}
intmain()
{
charstr[] ="hello,world!nice,to,meet,you";
constchardelim[] ="!,";
char*ptr=my_strtok(str, delim);
while (ptr!=NULL)
    {
printf("%s\n", ptr);
ptr=my_strtok(NULL, delim);
    }
return0;
}


五、字符分类函数


常见的字符分类函数

C语言中提供了一系列的字符分类函数,常见的包括:

image.png

这些函数都定义在头文件中,可以用于对字符进行判断和处理。


六、字符转换函数(大小写转换)

字符转换函数是C语言提供的用于将字符或字符串在不同字符集之间进行转换的函数。


常见的字符转换函数

  1. toupper:将小写字母转换为大写字母。
inttoupper(intc);
  1. tolower:将大写字母转换为小写字母。
inttolower(intc);
  1. atoi:将字符串转换为整数。如果字符串不能转换为整数,则返回0。
intatoi(constchar*str);
  1. atof:将字符串转换为双精度浮点数。如果字符串不能转换为双精度浮点数,则返回0.0。
doubleatof(constchar*str);
  1. strtol:将字符串转换为长整型整数。
longintstrtol(constchar*str, char**endptr, intbase);
  1. wcstombs:将wchar_t类型的字符串转换为char类型的字符串。
size_twcstombs(char*s, constwchar_t*pwcs, size_tn);
  1. mbstowcs:将char类型的字符串转换为wchar_t类型的字符串。
size_tmbstowcs(wchar_t*pwcs, constchar*s, size_tn);

需要注意的是,以上转换函数在转换时都要考虑当前的本地环境,因此在不同的本地环境下可能会有不同的转换结果。


七、总结

在使用字符串库函数时,需要加上头文件,即在程序开头加#include

介绍字符串函数的原型、使用演示及概述要点

介绍了什么是长度不受限制的字符串函数及长度受限制的字符串函数

模拟实现strlen、strcpy、strcat、strcmp、strstr、strtok函数


如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。

目录
相关文章
|
2天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
5天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
5天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
10天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
10天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
11天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
22天前
|
机器学习/深度学习 编译器 Serverless
C语言中函数
C语言中函数
17 0
|
1月前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
26天前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
22 4
|
26天前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。