「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

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎