字符函数和字符串函数(二)

news2024/11/23 23:44:35

目录

1.strncpy

2.strncat

3.strncmp

4.strstr

5.strchr

6.strtok

7.strerror

1.strncpy

ok,在上一篇博客的讲解中,我们谈到了strcpy这个函数,并且了解到了这个函数的功能是将源字符串的内容复制到目标字符串里,并且我们还知道了在C语言的标准中,strcpy是不允许内容重叠的,所以说,strcpy这个函数也就存在了一定的风险,因此,我们这里出现了一个新的函数来尽量的抵消这个风险。

先来看一下strncpy这个函数的声明

 再来对比一下strcpy的声明

 对比之下我们发现strncpy多了一个参数,其实这个参数的意思是复制元素的个数,下面我们用几个栗子来看一下这个函数的具体用法

int main()
{
    char ch[20] = "azaz_plus";
    char ch1[] = "plus_azaz";
    strncpy(ch, ch1, 4);
    printf("%s\n",ch);
    return 0;
}

int main()
{
    char ch[20] = "azaz_plus";
    char ch1[] = "plus";
    strncpy(ch, ch1, 6);
    printf("%s\n",ch);
    return 0;
}

 

这是为啥呢,其实是因为如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。追加的0也就是\0 

所以说这个函数的作用是从源字符串处复制n个字符到目标字符串。

关于这个函数的实现,大家可以在上一篇博客的基础上自行改进,这个很简单我就不再实现了。

2.strncat

Ok,在了解完上一个函数之后,想必,这个函数的作用大家也能猜出来。其实他的左右就是从源字符串向目标字符串处。

先来看一下定义

下面,我们通过几个栗子来展示一下这个函数的具体用法

int main()
{
    char ch[20] = "azaz_plus";
    char ch1[] = "plus";
    strncat(ch, ch1, 4);
    printf("%s\n",ch);
    return 0;
}

 

int main()
{
    char ch[20] = "azaz_plus";
    char ch1[] = "plus";
    strncat(ch, ch1, 6);
    printf("%s\n%d\n",ch,strlen(ch));
    return 0;
}

 

通过这个栗子,说明了strncat这个函数在遇到\0之后就会停止。 

3.strncmp

在经过上面的学习之后,相比,这个函数大家也一定差不多了解了他的含义,话不多说,我们先来看声明

 我们还是通过几个栗子,来让大家自己体会一下这个函数

int main()
{
    char ch[20] = "azaz_plus";
    char ch1[] = "aabz_plus";
    char ch2[] = "azaz";
    if (strncmp(ch, ch1, 1)==0)
    {
        printf("same1\n");
    }
    if (strncmp(ch, ch1, 2) > 0)
    {
        printf("ch1>ch\n");
    }
    if (strncmp(ch2, ch, 4) == 0)
    {
        printf("same2\n");
    }
    if (strncmp(ch2, ch, 6) == 0)
    {
        printf("same3\n");
    }
    return 0;
}

所以,这个函数是比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

4.strstr

好的,下面我们来看这个函数,闲来看他的声明,

char * strstr ( const char *str1, const char * str2);

这个函数的作用其实是,在str1中寻找str2这个字符串,如果找到了,就返回第一个所找到位置的指针,如果找不到,就返回NULL。

 我们还是用一个栗子来看一下

int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = strstr(str, "simple");
    puts(str);
    printf("\n%s\n", pch);
    return 0;
}

 

 通过这个栗子,我们不难发现,这个函数返回的是找到后第一个位置的指针。

5.strchr

上一个函数是在一个字符串中查找字符串,这一个是在一个字符串中查找一个字符。

我们还是先来看一下声明

char * strchr ( const char * str, int character );

 哎嗨?后面的值为啥是一个int???

其实就是char类型的本质就是int类型,其实很简单,这里用的是字符的 ASCII 码(因为每个字符都对应着一个 ASCII 码),这样在传值的时候既可以传“char”类型的值,又可以传“int”类型的值(0~127)。

下面我们来看一个栗子

int main()
{
    char str[] = "This is a sample string";
    char* pch;
    printf("Looking for the 's' character in \"%s\"...\n", str);
    pch = strchr(str, 's');
    while (pch != NULL)
    {
        printf("found at %d\n", pch - str + 1);
        pch = strchr(pch + 1, 's');
    }
    return 0;
}

 很明显,这里我们就不再提了。

6.strtok

然后我们来看这个函数,先来看声明

首先我们要了解一下几点 

1.delimiters参数是个字符串,定义了用作分隔符的字符集合

2.第一个参数指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标记
3. strtok 函数找到 str 中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针(注strtok函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4. strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在字符串 中的位置。
5. strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。

然后我们就可以通过栗子来切实的感受一下这个代码

int main()
{
    char str[] = "- This, a sample string.";
    char* pch;
    printf("Splitting string \"%s\" into tokens:\n", str);
    pch = strtok(str, " ,.-");
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " ,.-");
    }
    return 0;
}

int main()
{
    char* p = "azaz_plus@nbnb.com";
    const char* sep = ".@";
    char arr[30];
    char* str = NULL;
    strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
    for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
    {
        printf("%s\n", str);
    }
    return 0;
}

7.strerror

好的,我们现在来看这最后一个函数

其实他的作用是返回错误码,所对应的错误信息。  

C语言在发生错误的时候会将错误代码存储到errno这个整形变量里,这个变量需要包含头文件errno.h,我们不妨暂时来看一个栗子,后续我们会讲解到这个栗子中的知识,所以现在不会的不必担心

int main ()
{
  FILE * pFile;
  pFile = fopen ("unexist.ent","r");
  if (pFile == NULL)
    printf ("Error opening file unexist.ent: %s\n",strerror(errno));
  return 0;
}

 与这个类似的还有一个函数叫perror

这个函数的作用其实就是打印错误

int main ()
{
  FILE * pFile;
  pFile=fopen ("unexist.ent","rb");
  if (pFile==NULL)
    perror ("The following error occurred");
  else
    fclose (pFile);
  return 0;
}

 

ok,今天就到这里,我们下次再见。

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

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

相关文章

字符函数和字符串函数(三)

1.字符分类函数 在我们的日常代码生活中,经常会遇到一类问题,比如说判断一个字母的大小写,或者标点符号等。因此,我们需要用到一些字符分类函数 函数 如果他的参数符合下列条件就返回真 iscntrl 任何控制字符 isspace 空白字符&…

使用GPT4做Leetcode第 102 场双周赛

虽然一次周赛的几个题目说明不了太多问题,比如这个周赛的Hard题目就是板子题,算不上Hard,也许把第三题和第四题的顺序换一下比较合适。但是,GPT4的表现已经严重超出了我的预期。对于这次周赛的四个题目,GPT4的表现如下…

说走就走的接口自动化测试脚本:快速提高测试效率的秘密武器

目录 摘要: 环境准备 编写测试用例 运行测试脚本 总结 摘要: 作为一名测试工程师,我们常常需要进行接口测试,目的是验证接口是否符合规范并且稳定可靠。然而,手动测试难免会出现疏漏和人为错误,因此…

K_A35_003 基于STM32等单片机采集矩阵按键模块值 串口与OLED0.96双显示

K_A35_003 基于STM32等单片机采集矩阵按键模块值 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数引脚说明 三、驱动说明模块工作原理:对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RC矩阵按键模块1.2、STM32F103C8T6矩阵按键模块 五、基础知识学习与相…

把一个长方形平均分为4份,我想了几十种方法,不服来挑战

这是学习笔记的第 2455篇文章 这个事情的源头是在前几天哄孩子睡觉前,我和她聊分数的事情,一般为了便于理解我会拿披萨来举例,比如把一个披萨分成2份,分成3份,分成4份等,似乎顺着圆心我们可以想到既定的方案…

2023/4/25总结

刷题&#xff1a; 第一周任务 - Virtual Judge (vjudge.net) 1.这一题的思路就是先排除前面和后面相等的&#xff0c;然后找到不等的情况&#xff0c;不等情况的下标开始前后都走&#xff0c;看看是不是和b数组构成了一个升序数组即可。 #include<stdio.h> #define Ma…

50+常用工具函数之xijs更新日志(v1.2.4)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下v1.2.4 版本的更新内容以及后续的更新方向. 1. dom分类添加xss函数 该模块主要由 Kevin 贡献, 具体介绍如下: 使用方式: import { …

游戏有延迟?如何获得一个好的Ping

在多人游戏世界中,玩家要想获得良好的游戏体验,需要做很多事情——尤其是如果这种良好的体验取决于你的想法。 在线多人游戏,如FPS(第一人称射击游戏)、赛车和一些MMORPG类型的游戏,尤其取决于玩家对游戏反馈的及时有效反应。这个反馈和反应链有很多环节,其中一个环节是…

【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

最近在进行绘图时&#xff0c;遇到了matplotlib画散点图&#xff0c;并根据目标列的类别来设置颜色区间的问题&#xff0c;但是实现的过程较为艰辛。 文章目录 一、数据准备二、第一次尝试&#xff08;失败及其原因&#xff09;2.1 失败2.2 原因 三、第二次尝试&#xff08;成功…

详解客户关系管理系统

一、客户关系管理系统的重要性 客户关系管理系统&#xff0c;是指利用软件、硬件和网络技术&#xff0c;为企业建立一个客户信息收集、管理、分析和利用的信息系统。以客户数据的管理为核心&#xff0c;记录企业在市场营销和销售过程中和客户发生的各种交互行为&#xff0c;以…

Multisim电路仿真与实验:包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路:竞争冒险、数字锁

Multisim电路仿真与实验&#xff1a;包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路&#xff1a;竞争冒险、数字锁 文章目录 Multisim电路仿真与实验&#xff1a;包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路&#xff1a;竞争冒险、数字锁连续时间系统的…

JVM内存区域划分,类的加载过程 以及 双亲委派模型总结

目录 JVM内存区域划分 Java类的加载过程 双亲委派模型 JVM内存区域划分 JVM中的内存区域共划分为五大部分&#xff0c;分别为虚拟机栈、堆、程序计数器、本地方法栈和方法区&#xff0c;如下边这张图所示&#xff1a; 其中&#xff0c;每个内存区域主要存放的数据及功能如下…

Visual Studio C# WinForm开发入门(4):概述

目录 一.Winform入门1.WinForm项目结构2.窗口设计与控件布局3.窗口事件4.时间显示器小练习 二.WinForm布局开发1.手动布局解决自适应问题2.WinForm布局属性3.WinForm布局器 三.WinForm常用控件1.界面展示2.实体类 Student(封装信息)3.逻辑事件代码Form.cs 四.图片框与项目资源1…

大数据电商数仓相关脚本

文章目录 前言一、群起集群1. sc 脚本2. cluster 脚本3. myhadoop 脚本4. zk.sh 脚本5. kf.sh 脚本6. f1.sh 脚本7. f2.sh 脚本 二、简便使用脚本1. xsync 脚本2. jpsall 脚本3. xcall.sh 脚本4. lg.sh 脚本 三、数据传输相关脚本1. mysql_to_hdfs.sh 脚本2. hdfs_to_ods_db.sh…

《JavaEE初阶》HTTP协议和HTTPS

《JavaEE初阶》HTTP协议和HTTPS 文章目录 《JavaEE初阶》HTTP协议和HTTPSHTTP协议是应用层协议:使用Fiddler抓取HTTP请求和响应:Fiddler的下载和基本使用:Fiddler的中间代理人身份:其他抓包工具: 先简单认识HTTP请求与HTTP响应:HTTP请求:HTTP响应: HTTP请求详解:首行&#xff1…

分享10个精美可视化模板,解决95%的大屏需求!

前段时间和朋友一起喝茶&#xff0c;我吐槽着excel表格做报表的繁琐&#xff0c;他惊讶的问我竟然不知道大屏模板这种东西&#xff0c;说是直接套用数据就可以&#xff0c;我震惊的同时吃下了这个安利。 回来之后&#xff0c;我好好研究了一番这个叫可视化大屏的“新鲜玩意儿”…

模块化编程原理示意图--CommonJS 模块编程--ES6 模块编程思路分析/图解--三种导出形式--全部代码示例

目录 模块化编程 基本介绍 模块化编程原理示意图 模块化编程分类 CommonJS 模块编程 介绍 应用实例 1. 需求说明 2. 思路分析/图解 3. 代码实现 function.js use.html use.js ES6 模块编程 介绍 需求说明 思路分析/图解 代码实现 common.js use_common.js …

MySQL入门到精通——进阶篇(基础篇——进阶篇——运维篇)本文以MySQL8.0版本以上为例

文章目录 前言MySQL——进阶篇一、存储引擎1.存储引擎-MySQL体系结构2.存储引擎-简介3.存储引擎-InnoDB介绍4.存储引擎-MyISAM和Memory5.存储引擎-选择 二、索引1.索引-概述2.索引-结构2.1.索引-结构-介绍2.2.索引-结构-Btree2.3.索引-结构-Btree2.4.索引-结构-hash 3.索引-分类…

【Java-02】深入理解关键字和代码块

1 关键字 2 代码块 1 Java中的关键字 1.1 static关键字 static关键字 : 静态的意思 , 可以修饰变量 , 也可以修饰方法 , 被static修饰的成员 , 我们叫做静态成员 static特点 : 静态成员被所类的所有对象共享随着类的加载而加载 , 优先于对象存在可以通过对象调用 , 也可以通…

学习系统编程No.23【信号实战】

引言&#xff1a; 北京时间&#xff1a;2023/4/23&#xff0c;最近学习状态不怎么好&#xff0c;总是犯困&#xff0c;没精力的感觉&#xff0c;可能是病没有好彻底的原因&#xff0c;也可能是我内心因为生病而认为摆烂理所应当&#xff0c;反正最后导致摆烂&#xff0c;课现在…