「C/C++ 01」C标准库中常见的字符串处理函数

2024-05-01 12:28

本文主要是介绍「C/C++ 01」C标准库中常见的字符串处理函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、strlen()

2、strcpy()、strncpy()

3、strstr()

4、strcmp()、strncmp()

5、strcat()、strncat()(效率比 strcpy() 低)

6、strtok()

7、memset()


以下函数都在头文件#include<string.h>中

1、strlen()

strlen()函数和sizeof运算符 的区别:strlen()不算\0,sizeof()会算,一个是函数,一个是运算符。

2、strcpy()、strncpy()

#include <string.h>char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

函数说明:

(1)strcpy()函数将src指向的字符串(包括终止的空字节('\0'))复制到dest指向的buffer中,字符串不能重叠,而且目标字符串dest必须足够大。

(2)strncpy()函数与strcpy()类似,不同之处是可以指定最多复制src的前n个字节(如果在src的前n个字节中没有null,则放在dest中的字符串不会以0结尾)。

3、strstr()

用来查找子串。找到了返回开头的指针,没找到则返回NULL。

#include <string.h>char *strstr(const char *a, const char *b);

函数说明:

        strstr()函数在a指向的字符串中查找第一个出现的子字符串b。不比较终止字符Null字节('\0')。这些函数返回指向所定位子字符串开头的指针,如果没找到对应的子字符串,则返回NULL。

4、strcmp()、strncmp()

用来比较两个字符串,相同返回0,s1 > s2返回1,s1 < s2返回-1;

#include <string.h>int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);

函数说明:

(1)strcmp()用于比较两个字符串s1和s2。逐个字符去比较ASCII码,比较出大小时返回。一旦比较出不同,就会立即返回。返回值如下:

        如果s1指向的字符串 = s2指向的字符串  返回 0

        如果s1指向的字符串 > s2指向的字符串 返回 正数

        如果s1指向的字符串 < s2指向的字符串 返回 负数

(2)strncmp()比较s1和s2指向的字符串中的前n个字符,比较方法与strcmp()类似。

5、strcat()、strncat()(效率比 strcpy() 低)

尾插:将字符串s2尾插到s1的‘\0’处,结束再加上一个'\0'

#include <string.h>char *strcat(char *s1, const char *s2);
char *strncat(char *s1, const char *s2, size_t n);

函数说明:

(1) strcat()函数将src字符串添加到dest字符串中,覆盖了在位置结束的空字节('\0')
dest的末尾,然后添加一个终止空字节。返回值是指向dest的指针。

(2)strncat()函数与strcat()函数类似,至少strncat()可以指定最多来自src的前n个字节。

6、strtok()

用来拆分字符串,建议自己写一个更好用。

#include <string.h>char *strtok(char *str, const char *delim);

 函数说明:        

        strtok() 将字符串分解为零或多个非空标记的序列。str是要解析的字符串,在第一次调用strtok()时,必须要指定str。之后调用该函数想继续解析该字符串,str必须为NULL。

#include <stdio.h>
#include <string.h>int main(int argc,char *argv[])
{char    *token;char    str[] = "hello-world-I-am-a-person-of-harding-to-learn-code";token = strtok(str,"-");while( NULL != token ){   printf("string:%s\n",token);token = strtok(NULL,"-");}return 0;
}

7、memset()

用来初始化指针指向的内存空间。

#include <string.h>void *memset(void *s, int c, size_t n);

 常用的写法有三个:

memset(arr, 0, sizeof arr);
memset(arr, -1, sizeof arr);
memset(arr, 0x3f, sizeof arr);

 注意:

为地址s开始的n个字节赋值c,注意:是逐个字节赋值,str开始的n个字节中的每个字节都赋值为c。
(1) 若s指向char型地址,c可为任意字符值;
(2) 若s指向非char型,如int型地址,要想赋值正确,c的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。

 为什么c的值只能是-1或0 呢?

        通过memset(a,100,sizeof a)给int类型的数组赋值,你给第一个字节的是一百,转成二进制就是0110 0100,而int有四个字节,也就是说,一个int被赋值为0110 0100,0110 0100,0110 0100,0110 0100,对应的十进制是1684300900,根本不是你想要赋的值100,这也就解释了为什么数组中的元素的值都为1684300900。
 


至于0x3f,这是编程竞赛中常用到的一个数值,0x3f3f3f3f约为10亿,差不多是int上限的一半,一般为编程竞赛中的最大值,在memset中使用0x3f,相当于把每四个字节即一个int数字初始化为0x3f3f3f3f。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

这篇关于「C/C++ 01」C标准库中常见的字符串处理函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951684

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表