【C语言】常见的字符串处理函数

news2024/10/7 8:20:44

目录

1、strlen()函数

2、strcpy()、strncpy()函数

3、strstr() 函数

4、strcmp()、strncmp()函数

5、strcat()、strncat()函数

6、strtok()函数

7、memset()函数


        本篇文章为大家详细讲解C语言中常用的几种字符串处理函数及其用法,让我们一起来学习吧!

1、strlen()函数

函数原型:

#include <string.h>

size_t strlen(const char *s);

函数说明:

        strlen()函数计算s指向的字符串的长度,不包括终止的null字节(' \ 0”)。strlen()函数返回s所指向的字符串的字节数。

代码演示:

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

int main(int argc, char **argv)
{
    char   str[] = "hello";
    int    len = 0;

    len = strlen(str);
    printf("len:%d\n", len);        //正确结果:len = 5

    return 0;
}

注意:

        说起计算字符串长度的函数,大家一定还会想到sizeof函数,但大家一定要知道strlen()函数和sizeof()函数的区别!我接下来用代码给大家演示一下!

#include <stdio.h>
#include <string.h>
   
int main(int argc,char *argv[])
{  
    char str[1024] = "hello";
    char std[]     = "hello";
    int  len       = 0;
   
    len = strlen(str);
    printf("len:%d\n",len);    //正确结果:len=5
   
    len = sizeof(str);
    printf("len:%d\n",len);    //正确结果:len=1024
   
    len = strlen(std);
    printf("len:%d\n",len);    //正确结果:len=5
   
    len = sizeof(std);
    printf("len:%d\n",len);    //正确结果:len=6
   
    return 0;        
}    

        为什么计算的字符串长度大小不一样呢?这是因为strle你()会从字符串的开头开始计算,直到遇到 null 字符为止,然后返回计数值。而sizeof()函数用于获取变量或类型所占用的内存字节数。对于字符数组,sizeof()返回数组的总大小。而计算字符串长度时,sizeof() 会将整个字符数组的大小计算进去,因此得到的值比strlen()返回的值大 1(因为 null 字符也算进去了)。

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结尾)。

代码演示:

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

int main(int argc,char *argv[])
{
    char src[] = "hello";
    char dest_1[15];
    char dest_2[15];

    strcpy(dest_1,src);
    printf("dest_1:%s\n",dest_1);    //打印结果:hello
 
    strncpy(dest_2,src,3);
    printf("dest_2:%s\n",dest_2);    //打印结果:hel

    return 0;
}

注意:

        使用strcpy()函数进行字符串复制时,源字符串和目标字符串不能指向同一个内存区域。

3、strstr() 函数

函数原型:

#include <string.h>

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

函数说明:

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

代码演示:

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

int main(int argc,char *argv[])
{
    char src[] = "hello-world-how-are-you";
    char *ptr;

    ptr = strstr(src,"-");
    printf("%s\n",ptr);        //打印结果:-world-how-are-you

    return 0;
}

4、strcmp()、strncmp()函数

函数原型:

#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()类似。

代码演示:

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

int main(int argc,char *argv[])
{
    char src[] = "hello";
    char srd[] = "hello";
    char srp[] = "hel";
    char srq[] = "hello world";
    int  rv = -1; 
    
    rv = strcmp(src,srd);
    printf("rv:%d\n",rv);        正确结果:src和srd相等,所以rv=0

    rv = strcmp(src,srp);
    printf("rv:%d\n",rv);        正确结果:逐个字符比较,src比srp大l,找对应的ASCII码表,因为src>srp,所以rv=108

    rv = strcmp(src,srq);
    printf("rv:%d\n",rv);        正确结果:逐个字符比较,src比srq小 (空格),找对应的ASCII码表,因为src<srq,所以rv=-32

    rv = strncmp(src,srq,5);
    printf("rv:%d\n",rv);        正确结果:前五个字符,src和srq相等,所以rv=0

    return 0;
}

ASCII表参考如下:

5、strcat()、strncat()函数

函数原型如下:

#include <string.h>

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

函数说明:

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

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

代码演示:

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

int main(int argc,char *argv[])
{
    char dest[16] = "hello";
    char src [8]  = "world";
    char *ptr;

    ptr = strcat(dest,src);
    printf("ptr:%s\n",ptr);    //正确结果:helloworld

    ptr = strncat(dest,src,2);
    printf("ptr:%s\n",ptr);    //正确结果:helloworldwo
    
    printf("dest:%s\n",dest);   //正确结果:helloworldwo
    printf("src:%s\n",src);     //正确结果:world

    return 0;
}

注意:

         strcat()函数将src字符串添加到dest字符串中,所以必须要保证dest有足够的内存空间来容纳两个字符串,否则会导致溢出错误。dest末尾的\0会被覆盖,src末尾的\0会被复制过去,最终的字符串只有一个\0 。

6、strtok()函数

函数原型:

#include <string.h>

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

函数说明:        

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

        delim参数指定一组字节,用于界定解析字符串中的标记。在解析相同字符串的连续调用中,调用者可以在delim中指定不同的字符串。

        每次调用strtok()都会返回一个指向包含下一个token的以空字符结尾的字符串的指针。这个字符串不包含分隔符字节。如果没有找到token, strtok()返回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;
}

 正确打印结果:

        接下来,以这个代码为例,给大家讲解一下strtok()是如何工作的。

        首先,在str指向的字符串中找到第一个“-”字符,并用NULL('/0')代替。然后返回一个指针token指针指向以空字符结尾的字符串。所以第一次打印hello 。

        然后,strtok(NULL,"-")就是继续解析相同的字符串。继续找下一个“-”,并用NULL('/0')代替。然后返回一个指针token指针指向以空字符结尾的字符串。所以第二次打印world。

 

        依此类推,就有如上的结果,不懂的同学可以私信问我。

7、memset()函数

函数原型:

#include <string.h>

void *memset(void *s, int c, size_t n);

函数说明:

        memset()函数用常量字节c填充s指向的内存区域的前n字节。

代码演示:

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

int main(int argc,char *argv[])
{
    char    str[] = "hello";

    memset(str,'!',sizeof(str));
    printf("str:%s\n",str);

    return 0;
}

 正确打印结果:

 注意:

为地址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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCache和redis区别?什么是SpringCache?

目录 一、Redis介绍1.1 Redis缓存1.2 redis缓存使用前提1.3 redis使用缓存的时机 二、实际操作案例2.1 常规准备工作2.2 引入配置redis2.2.1 引入redis的启动依赖2.2.2 在application.yml里面配置redis的地址信息等2.2.3 创建redisTemplate的配置类&#xff0c;指定键值序列化方…

SpringCloud Sleuth 分布式请求链路跟踪

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十篇&#xff0c;即介绍 Sleuth 分布式请求链路跟踪。 二、概述 2.1 出现的原因 在微服务框架中&…

JavaWeb后端——分层解耦 IOC DI

分层/三层架构概述 三层架构&#xff1a;Controller、Service、Dao 解耦/IOC&DI概述 分层解耦 容器称为&#xff1a;IOC容器/Spring容器 IOC 容器中创建&#xff0c;管理的对象&#xff0c;称为&#xff1a;bean 对象 IOC&DI入门 实现 IOC&DI 需要的注解&#…

21-分支和循环语句_while语句(中)(初阶)

21-2 代码准备 getchar()&#xff1a;获取字符 int ch getchar(); //把获取的字符的ASCII码值放在ch中 int main() {int ch getchar();printf("%c\n", ch); //ch存的是该字符的ASCII码值&#xff0c;此处以字符形式打印ASCII码值对应的字符putchar(ch); } 运…

C++容器适配器与stack,queue,priority_queue(优先级队列)的实现以及仿函数(函数对象)与deque的简单介绍

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

简单的溯源取证

环境准备: Linux虚拟机:内网部署蜜罐探测系统 。(192.168.XX.XX) windows虚拟机:有FTP弱口令漏洞的web服务 (受害机器) (192.168.125.134) kali Linux虚拟机:攻击机服务端 。 (192.168.125.130) MAC:管理员电脑。(192.168.XX.XX) 一、利用kailiLinuxmsf生成windows木马文件…

Maven项目 快速修复log4j 漏洞

1、log4j 漏洞介绍 log4j的漏洞介绍以及原理请参考文章 &#xff0c;网址详见下面文章 Log4j漏洞原理及修复_linux log4j漏洞修复方案-CSDN博客&#xff0c;遇到这个漏洞要升级log4j 的jar包到2.17.0 以上。 2、项目快速处理方案 由于maven 管理jar 的spring 项目或者…

dpdk二层转发环境搭建-二

文章目录 前言虚拟机的网络拓扑结构网络拓扑结构网络配置 DPDK的准备工作DPDK的编译网卡绑定 测试 前言 我之前尝试通过namespace&#xff0c;搭建dpdk的测试环境&#xff0c;但是对于tcp有点问题&#xff0c;而且过程也比较麻烦&#xff0c;见&#xff1a; dpdk网络转发环境的…

es文档操作命令

文档操作 documents 创建数据&#xff08;put&#xff09; 向 user 索引下创建3条数据 PUT /user/_doc/1 {"name":"zhangsan","age":18,"sex":"男","info":"一顿操作猛如虎&#xff0c;一看工资2500"…

【OpenCV • c++】图像平滑处理(1) —— 线性滤波

文章目录 一、平滑处理二、图像滤波三、邻域算子与线性邻域滤波四、方框滤波代码演示 一、平滑处理 平滑处理也称为模糊处理&#xff0c;是一种简单且使用频率很高的图像处理方法&#xff0c;平滑处理的用途有很多&#xff0c;最常见的是用来减少图像上的噪点或者失真。在涉及到…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:EffectComponent)

特效合并容器组件&#xff0c;用于子节点特效绘制的合并&#xff0c;实现特效的绘制性能优化。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件为系统接口。 目前该组件仅支持子组件背景…

[java基础揉碎]Object类详解

目录 equals方法: hashCode: toString: finalize: equals方法: 和equals对比 1.: 既可以判断基本类型&#xff0c;又可以判断引用类型 2.: 如果判断基本类型&#xff0c;判断的是值是否相等。示例: int i10; double d10.0; 3.:如果判断引用类型&#xff0c;判断的是地址是…

信息检索(十三):On Complementarity Objectives for Hybrid Retrieval

On Complementarity Objectives for Hybrid Retrieval 摘要1. 引言2. 相关工作2.1 稀疏和密集检索2.2 互补性 3. 提出方法3.1 Ratio of Complementarity (RoC)3.2 词汇表示&#xff08;S&#xff09;3.3 语义表示&#xff08;D&#xff09;3.4 互补目标 4. 实验4.1 实验设置4.2…

哪里有视频素材网站免费下载?高清烟花视频素材哪里有?

如果你在寻找那些能点亮夜空的绚丽烟花视频素材&#xff0c;或者无水印的高清视频素材&#xff0c;那下面这些资源网站将会是你的宝库。今天&#xff0c;我要分享给你一些最佳的无水印视频素材下载网站&#xff0c;让你的视频制作闪耀起来。 1.蛙学府 这个网站是视频创作者的天…

windows使用docker运行TP6使用swoole内置http服务

1&#xff0c;下载docker-Windows客户端 下载地址&#xff1a;https://www.docker.com/products/docker-desktop docker --version #查看docker版本 docker-compose --version #查看docker-compose版本 2&#xff0c;安装环境 使用一键安装包&#xff1a;https://gitee.com/yes…

如何在Linux CentOS部署宝塔面板并实现固定公网地址访问内网宝塔

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…

Android和IOS应用开发-Flutter 应用中实现记录和使用全局状态的几种方法

文章目录 在Flutter中记录和使用全局状态使用 Provider步骤1步骤2步骤3 使用 BLoC步骤1步骤2步骤3 使用 GetX&#xff1a;步骤1步骤2步骤3 在Flutter中记录和使用全局状态 在 Flutter 应用中&#xff0c;您可以使用以下几种方法来实现记录和使用全局状态&#xff0c;并在整个应…

深度学习pytorch——基本数据类型创建Tensor(持续更新)

声明&#xff1a;本深度学习笔记基于课时18 索引与切片-1_哔哩哔哩_bilibili学习而来 All is about Tensor 定义&#xff1a;Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars and vectors. In fact tensors a…

粤嵌6818开发板通过MobaXterm使用SSH连接开发板

链接&#xff1a;https://pan.baidu.com/s/18ISP4Ub1HtQx6jCvTQTUHw?pwdfjmu 提取码&#xff1a;fjmu 1.把SSH_config.tar.bz 下载到开发板中 2.解压 SSH_config.tar.bz 解压命令&#xff1a;tar -xzvf SSH_config.tar.bz 3.配置SSH 进入SSH/openssh目录&am…

【深度长文】聊一聊 Java AbstractQueuedSynchronizer 以及在 ReentrantLock 中的应用

文章目录 AQS 原理简述内部数据结构公平锁 vs. 非公平锁ReentrantLock 非公平锁ReentrantLock 公平锁 AQS 源码分析加锁过程addWaiteracquireQueuedshouldParkAfterFailedAcquirecancelAcquire 解锁过程unparkSuccessor AbstractQueuedSynchronizer (AQS) 是 Java 并发包中&…