C语言----字符串操作函数汇总

这篇具有很好参考价值的文章主要介绍了C语言----字符串操作函数汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在C的库函数中,有丰富的字符串操作函数,在平时的coding中灵活运用这些库函数会达到事半功倍的效果

一:str系列

char *strcpy(s, ct) 将字符串ct(包括'\0')复制到字符串s中,并返回s,需要注意s的长度是否容纳ct。
char *strncpy(s, ct, n)

将字符串ct中最多n个字符复制到字符串s中,并返回s。如果ct中少于n个字符,则用'\0'填充

如果n小于ct的长度,即复制部分ct中的字符,是没有\0的,需要手动添加

在strncpy中,长度指定了多少个字符将被写入到目标字符数组里,如果源字符串比指定指定长度更长,则字符串将不会以\0字节结尾。

char *strcat(s, ct) 将字符串ct连接到s的尾部,并返回s,src和dst重叠结果未定义,并且必须保证目标字符数组剩余空间足以容纳整个源字符串
char *strncat(s, ct, n)

将字符串ct中最多前n个字符连接到字符串s的尾部,并以'\0'结束;返回s

strncat函数的长度参数指定从源字符串复制过来的字符的最大数目,但它的结果始终以一个\0字节结尾。

int *strcmp(cs, ct) 比较字符串cs和ct;当cs<ct时,返回一个负数;当cs==ct返回0;当cs>ct返回值大于0
int *strncmp(cs, ct,n) 比较字符串cs和ct中签n个字符;当cs<ct时,返回一个负数;当cs==ct返回0;当cs>ct返回值大于0
char *strchr(cs, c) 返回指向字符c在字符串cs中第一次出现的位置的指针;如果cs中不包括c,则该函数返回NULL
char *strrchr(cs, c) 返回指向字符c在字符串cs中最后一次出现的位置的指针,如果cs中不包括c。则返回NULL
size_t strcspn(str1, str2) 检索字符串str1开头连续有几个字符都不含字符串str2的字符
size_t strlen(str) 计算字符串str的长度,直到空结束字符,但不包含空结束字符
char *strpbrk(str, c) 在str字符串中检索第一个匹配str2中字符的字符,返回该位置(不包含\0)
size_t strspn(str1, str2) 检索字符串str1中第一个不在字符串str2中出现的字符下标
char *strstr(str1, str2) 在str1中查找第一次出现str2的位置
char *strtol(str, delim) 以delim为界分割字符串

        在上面的函数中,有些是成对的出现如strcpy和strncpy,strcmp和strncmp,两个函数从命名上看就一字之差,后者加了个n,那是因为前者在某些条件下是不安全的,我们一般称之为不安全函数,后者的出现就是为了弥补不安全函数带来的隐患,但是前者已经使用了多年,也不好在原来的基础上改,所以另起了一个函数。

        我们就以strcpy和strncpy为例来看看为什么说strcpy是不安全的

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

int main()
{
    // please write your code here
    char *myName = "ftz";

    char oriarr[5] = {0};
    strcpy(oriarr,myName);
    printf("enough space:%s\n",oriarr);

    char oriarr2[2] = {0};
    strcpy(oriarr2,myName);
    printf("not enough space:%s\n",oriarr2);
   
}

结果:

C语言----字符串操作函数汇总,C/C++,c语言,数据结构

        可以看到,在目的字符串的空间不足的情况下,源字符串还是拷贝过去了,踩到了目的字符串后边的内存,这会产生不可预料的错误。

        在strncpy中增加了一个参数n,可以由调用者自己去灵活的设置需要拷贝的字节数,另外函数的说明里也提示了调用者应该怎么做保证安全。

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

int main()
{
    // please write your code here
    char *myName = "ftz";

    //strncpy(s, ct, n) normal
    char oriarr[5];
    strncpy(oriarr,myName,4);
    printf("normal:%s\n",oriarr);

    //strncpy(s, ct, n) ct中少于n个字符
    char oriarr2[5];
    strncpy(oriarr2,myName,5);
    printf("ct中少于n个字符:%s\n",oriarr2);

    //strncpy(s, ct, n)  n小于ct的长度  需要手动添加\0
    char oriarr3[5];
    strncpy(oriarr3,myName,2);
    oriarr3[2] ='\0';
    printf("n小于ct的长度:%s\n",oriarr3);
   
}

结果:

C语言----字符串操作函数汇总,C/C++,c语言,数据结构

 二:mem系列

void *memchr(void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。若未出现字符则返回NULL
int memcmp(str1, str2, n) 把str1和str2的前n个字节进行比较。

如果返回值 < 0,则表示 str1 小于 str2。

如果返回值 > 0,则表示 str1 大于 str2。

如果返回值 = 0,则表示 str1 等于 str2。

void *memcpy(dst, src, n) 从src复制n个字节到dst,并返回dst的指针
void *memmove(dst, src, n) 从src复制n个字节到dst,并返回dst的指针。重叠时也能正确复制
void *memset(str, c, n) 复制字符c到参数str所指向的字符串的前n个字节

        个人在编码中mem系列的使用频次比str系列的高,利用mem系列的函数需要特别注意的是对最后一个传参n的保护,保证我们要操作的内存是绝对安全的,只对我们的目标内存进行操作。

三:两个系列的比较

1,memchr与strchr

memchr检测的是一段内存,strchr检查的是一个字符串;

strchr会停在\0但memchr不会;

memchr的效率也会更高;

2,memcmp与strcmp

功能比较:

二者都可以用于字符串的比较,但是二者是有比较大的差异的

strcmp是按照字节(byte-wise)比较的,并且比较的过程中会检查是否出现了"\0"结束符,一旦任意一个字符串指针前进过程中遇到结束符,将终止比较;

memcmp函数是用于比较两个内存块的内容是否相等,在用于字符串比较时通常用于测试字符串是否相等,不常进行byte-wise的字符串比较;

如果要比较的对象中包含一些由于边界对齐需求而填入结构对象中的空格、联合 (union)结束的额外空格、字符串所分配的空间未使用完的部分引起的“holes”的话,最好不能使用memcmp;

效率差异:

 strcmp比较的字符串,strcmp需要时刻检查是否遇到了字符串结束的 \0 字符

memcmp比较的是内存块,不需要检查是否有\0

所以memcmp的效率要高于strcmp

3,memcpy与strncpy

二者对内存重叠均没有保护,区别在于:

当拷贝的字节数小于等于src字符串长度时,二者是等价的;当拷贝的字节数大于src字符串的长度时,strncpy使用\0补齐字节数,memcpy会按照地址继续复制,会造成故障。

strncpy根据指定长度的字符串进行内容拷贝,遇到0时会终止;memcpy不终止。

4,memcpy和memmove

当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

memmove与memcpy的区别(ABD)

A、内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确

B、当src内存区域和dest内存区域重叠时且dest所在区域在src所在区域前,memcpy可以正确拷贝

C、当src内存区域和dest内存区域重叠时且src所在区域在dest所在区域前,memcpy可以正确拷贝

D、对于BC,memmove都可以正确拷贝

memcpy和memmove的描述正确的是【仅考虑执行结果,不考虑规范性】C

A、源、目的地址有重叠时只能用memmove

B、源、目的地址无重叠时只能用memcpy

C、源、目的地址有重叠,且源>目的时,只能用memmove

D、源、目的地址有重叠,且源<目的时,只能用memmove

 文章来源地址https://www.toymoban.com/news/detail-634938.html

到了这里,关于C语言----字符串操作函数汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言中的字符串操作函数自定义实现:标准版与限定长度版

            目录 1. 标准字符串操作函数自定义实现 (a) 自定义strcpy函数 (b) 自定义strcat函数 (c) 自定义strcmp函数 2. 限定长度字符串操作函数自定义实现 (a) 自定义strncpy函数 (b) 自定义strncat函数 (c) 自定义strncmp函数  对字符串的操作是不可或缺的一部分。标准库提供了如strcpy、

    2024年01月21日
    浏览(58)
  • Matlab之数组字符串函数汇总

    在 MATLAB 中, 数组字符串是指由字符组成的一维数组。 字符串可以包含 字母、数字、标点符号和空格 等字符。 MATLAB 提供了一些函数和操作符来创建、访问和操作字符串数组。 例如: 例如: 访问字符数组的元素可以使用索引,索引从 1 开始。例如,要访问字符串数组 str

    2024年02月09日
    浏览(60)
  • C语言:字符函数和字符串函数(一篇拿捏字符串函数!)

    目录 求字符串长度: 1. strlen(字符串长度) 长度不受限制函数: 2. strcpy(字符串拷贝) 3. strcat(字符串追加) 4. strcmp(字符串比较) 长度受限制函数: 5. strncpy(字符串拷贝) 6. strncat(字符串追加) 7. strncmp(字符串比较) 字符串查找: 8. strstr(查找字符串子串) 9. strtok(字符串分割) 错误信

    2024年02月10日
    浏览(104)
  • 【C语言】字符函数,字符串函数,内存函数

    大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower(将大写字母转化为小写字母) 1.2.2 toupper(将小写字母转化为大写字母) 2. 字符串函数 2.1 字符串输入函数 2.1.1 gets() ​2.1.2 fgets() 2.2 字符串

    2024年02月10日
    浏览(59)
  • C语言 - 字符函数和字符串函数

    目的:学习主要常见字符串和字符串函数,及其部分函数的模拟过程。 C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h。 这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其

    2024年02月05日
    浏览(76)
  • C语言——字符函数和字符串函数

    assert.h 头文件定义了宏assert(),⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为 “断⾔” 。 assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(

    2024年04月25日
    浏览(54)
  • C语言:字符函数和字符串函数

    C语言:初识C语言 C语言:分支语句和循环语句 C语言:函数 C语言:数组 C语言:操作符详解 C语言:指针详解 C语言:结构体 C语言:数据的存储 今天来盘一下字符函数和字符串函数。 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常

    2024年02月11日
    浏览(68)
  • 【C语言】字符函数和字符串函数

      目录 1.求字符串长度strlen 2.长度不受限制的字符串函数 字符串拷贝strcpy 字符串追加strcat 字符串比较strcmp 3.长度受限制的字符串函数介绍strncpy strncat ​编辑strncmp 4.字符串查找strstr 5.字符串分割strtok 6.错误信息报告 strerror perror 7.字符分类函数 8.字符转换函数  9.内存操作函

    2024年02月12日
    浏览(59)
  • C语言—字符函数和字符串函数

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。 strlen函数的介绍 strlen函数用于求字符串的长度 注: 字符串已经 ‘\\0’ 作为结束标志,strlen函

    2024年02月07日
    浏览(45)
  • 【Kotlin】字符串操作 ① ( 截取字符串函数 substring | 拆分字符串函数 split | 解构语法特性 )

    Kotlin 中提供了 截取字符串函数 substring , 可接收 IntRange 类型的参数 , 这是 整数范围 类型 ; 截取字符串函数 substring 函数原型为 : 整数范围类型 : 其整数范围是 {0 , 1 , 2 , 3} ; 其整数范围是 {0 , 1 , 2} ; 代码示例 : 执行结果 : 拆分字符串函数 split 返回的是 List 集合 ; 拆分字符串函

    2023年04月08日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包