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

目录

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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数据结构]堆

一、堆是什么&#xff1f; 堆是一种完全二叉树 完全二叉树的定义&#xff1a;完全二叉树的形式是指除了最后一层之外&#xff0c;其他所有层的结点都是满的&#xff0c;而最后一层的所有结点都靠左边。​​​​​​&#xff0c;从左到右连续。 教材上定义如下: 若设二叉树的…

AI检测识别技术,为智能化视频生产赋能

在科技飞速发展的今天&#xff0c;智能化生产已经成为企业提高效率、降低成本、增强竞争力的关键所在。美摄科技&#xff0c;作为一家在音视频处理技术领域保持领先的创新型企业&#xff0c;不仅致力于提供卓越的音视频处理技术&#xff0c;更在AI检测识别领域积累了深厚的实力…

机器视觉相关硬件

机器视觉相关硬件 完整的图像采集系统一般包括相机、镜头、图像采集卡、光源等。硬件的选型将关系到图像的质量和传输的速率&#xff0c;也会间接影响视觉软件算法的工作效率。硬件和软件需要配合得当&#xff0c;彼此互补。本文将介绍机器视觉的4个主要硬件的选型。 一、相机…

【日常记录】【插件】使用ColorThief,跟随图片变化改变网页背景

文章目录 1、效果图2、ColorThief3、实现4、参考链接 1、效果图 想要实现,界面的背景颜色,跟随图片的 颜色来进行展示, 2、ColorThief 要想实现跟随图片变化实现网页背景渐变效果&#xff0c;则需要获取图片的主要颜色&#xff0c;可以使用ColorThief库来获取图片的颜色 需要注…

你真的会做抖音小店吗?你做抖店的方法是正确的吗?教学分享

大家好&#xff0c;我是电商花花。 新的一年&#xff0c;不少做抖店的商家都会产生一个疑问&#xff0c;2024年抖音小店无货源还能继续做吗&#xff1f; 做无货源模式还会被处罚吗&#xff1f; 先说答案&#xff0c;2024年抖音小店无货源能做&#xff0c;不仅能做且仍然是抖音…

Java学习笔记(14)

常用API Java已经写好的各种功能的java类 Math Final修饰&#xff0c;不能被继承 因为是静态static的&#xff0c;所以使用方法不用创建对象&#xff0c;使用里面的方法直接 math.方法名 就行 常用方法 Abs,ceil,floor,round,max,minm,pow,sqrt,cbrt,random Abs要注意参数的…

电商评论数据聚类实验报告

目录 实验目的整体思路数据介绍代码与实验步骤 4.1 爬虫代码 4.2 数据清洗 4.3 分词 4.4 去停用词 4.5 计算TF-IDF词频与聚类算法应用 4.6 生成词云图实验结果 5.1 词云图 5.2 聚类结果分析不足与反思参考资料 1. 实验目的 掌握无监督学习问题的一般解决思路和具体解决办法&…

讯鹏智能边缘计算网关主机,支持MQTT协议主动上传上位机软件平台

随着科技的不断发展&#xff0c;智能化设备在我们的生活中扮演着越来越重要的角色。而智能边缘计算网关作为连接智能设备与互联网的重要纽带&#xff0c;其远程运维功能为管理者带来了极大的便利。特别是像OkEdge边缘计算网关这样的产品&#xff0c;不仅可以替代传统的Windows系…

Unity中使用AVPro Video播放视频的完全指南

Unity AVPro是一款强大的视频播放解决方案&#xff0c;它支持多种视频格式和编解码器&#xff0c;能够在Unity中实现高质量的视频播放。本教程将指导你如何在Unity项目中使用AVPro播放视频。 目录如下 1、安装AVPro Video2、在UI上显示视频3、在3D物体上显示视频&#xff0c;…

JWT(跨域身份验证解决方案)

Json web token (JWT), 跨域身份验证解决方案,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于…

jQuery 常用API

一、jQuery 选择器 1.1 jQuery 基础选择器 原生 JS 获取元素方式很多&#xff0c;很杂&#xff0c;而且兼容性情况不一致&#xff0c;因此 jQuery 给我们做了封装&#xff0c;使获取元素统一标准。 1.2 jQuery 层级选择器 jQuery 设置样式 1.3 隐式迭代&#xff08;重要&…

算法打卡day21|回溯法篇01|理论知识,Leetcode 77.组合

回溯法理论知识 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。所以回溯函数也就是递归函数&#xff0c;指的都是一个函数。 回溯法的效率 回溯法并不是什么高效的算法。因为回溯的本质是穷举&#xff0c;…

打靶记录(个人学习笔记)

一、信息收集 1、主机发现 通过nmap对此网段进行扫描&#xff0c;可以确定靶机ip为192.168.189.144 2、端口扫描 确定了靶机ip之后&#xff0c;我们来扫描端口 发现80端口开放&#xff0c;先访问80端口 用插件识别出一些信息 Wappalyzer插件获得信息&#xff1a;Web服务&am…

jquery 列表框可以手动修改(调用接口修改)

类似于这种 直接上代码 列表框 <td>//目的主要是获取属性名的(要更改的属性名) 在下面juqery的这一行(var field $(thisobj).prev(input).attr(name);)有体现<input type"hidden" name"voyage" value"${M_PSI_PERIOD_INFO.port}">…

卓越巨人wzy

解法&#xff1a; 向下取整同理&#xff0c;f(n)20230416-n 当n20230416时&#xff0c;f&#xff08;n&#xff09;0&#xff0c;之后由于向上取整&#xff0c;结果恒为0. #include<iostream> #include<algorithm> #include<vector> using namespace std; …

关系型数据库mysql(1)基础认知和安装

目录 一.数据库的基本概念 1.1数据 1.2表 1.3数据库 1.4 DBMS 数据库管理系统 1.4.1基本功能 1.4.2优点 1.4.3DBMS的工作模式 二.数据库的发展历史 2.1发展的三个阶段 第一代数据库 第二代数据库 第三代数据库 2.2mysql发展历史 三.主流数据库 四.关系型数据库和…

Windows三大认证! NTLM_Relay攻击

Windows有三大认证 NTLM本地认证NTLM网络认证Kerberos域认证 1.Kerberos域认证 对于Kerberos域认证&#xff0c;我之前讲过很多的文章 所以这里就不再赘述了 2.NTLM本地认证 其实就是windows本地登录认证&#xff0c;我之前也讲过&#xff0c;于是也不再赘述了 hhh&#x…

【Lexus】Executive Sedan

文章目录 【基础信息】车漆颜色历年指导价2.5L车型保养 【缺点】混动车型缺点负面 【对比】ES200 vs ES200 龙年限定ES200 vs ES260ES200 vs ES300hES200 vs NX260ES200 vs BMW 325i M 运动曜夜 【Buy】【尺寸】 【基础信息】 丰田&#xff0c;雷克萨斯&#xff0c;1997推出第…

android studio 安装lombok插件

android studio 安装lombok插件 由于 AS 不是基于 IDEA release 版本进行开发的&#xff0c;因此lombok对idea的插件可能再as中无法查看到。因此再as中通过plugins管理无法安装lombok插件。这就导致再gradle引入lombok后&#xff0c;虽然编译可能会通过&#xff0c;但是代码在查…

分布式接口幂等性解析

一、概述 幂等性定义&#xff1a;用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生了副作用。【同一操作指的是同一个浏览器&#xff0c;发送相同的请求】。 常见场景&#xff1a; 提交订单接口。返回提交结果时网络出现故障&am…