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

news2024/11/23 23:45:56

1.字符分类函数

在我们的日常代码生活中,经常会遇到一类问题,比如说判断一个字母的大小写,或者标点符号等。因此,我们需要用到一些字符分类函数

函数
如果他的参数符合下列条件就返回真
iscntrl
任何控制字符
isspace
空白字符:空格 ‘ ’ ,换页 ‘\f’ ,换行 '\n' ,回车 ‘\r’ ,制表符 '\t' 或者垂直制表符 '\v'
isdigit
十进制数字 0~9

isxdigit

十六进制数字,包括所有十进制数字,小写字母 a~f ,大写字母 A~F
islower
小写字母 a~z
isupper
大写字母 A~Z
isalpha
字母 a~z A~Z
isalnum
字母或者数字, a~z,A~Z,0~9
ispunct
标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph
任何图形字符
isprint
任何可打印字符,包括图形字符和空白字符

在这里,我们取两个函数为栗子

int tolower ( int c );
int toupper ( int c );

tolower与toupper是把一个字母变成小写或者是大写。 

至于参数为什么是int,在之前我们已经说过了,在这里就不在多提了

#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
 {
    c=str[i];
    if (isupper(c)) 
        c=tolower(c);
    putchar (c);
    i++;
 }
  return 0;

2.内存处理函数

之前我们了解到的一些函数都是字符串或者是字符函数,很明显那是针对字符或者是字符串的,但是如果我们相对一个整形的数组进行类似的处理呢?这个时候就需要用的内存处理函数,因为内存处理函数是对内存进行的改变,因此,不论是何种类型都可以使用。

1.memcpy

好的,因为我们之前了解了一些关于字符串的函数,所以这个一眼就能猜出是什么意思,也就是内存复制函数。我们还是先来看他的定义。

void * memcpy ( void * destination, const void * source, size_t num );

第一个参数的意思是目标地址,第二个参数是源地址,第三个是要复制的内存大小,单位是字节。

为什么参数类型是void的,很简单,因为这是内存处理函数,我们可能会用它来处理各种各样不同类型的数据,因此我们需要一个类型来接受各种不同的类型,所以这里采用了void类型的指针。

下面我们来看一下相关的注意事项

1.函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。
2.这个函数在遇到 '\0' 的时候并不会停下来。
3.如果 source destination 有任何的重叠,复制的结果都是未定义的。 

ok,下面我们还是通过一个栗子来看一下这个代码的具体作用

 

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

struct {
    char name[40];
    int age;
} person, person_copy;

int main()
{
    char myname[] = "Pierre de Fermat";

    /* using memcpy to copy string: */
    memcpy(person.name, myname, strlen(myname) + 1);
    person.age = 46;

    /* using memcpy to copy structure: */
    memcpy(&person_copy, &person, sizeof(person));

    printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);

    return 0;
}

  

关于函数的实现这里我就不再做过多的讲解了,大家看一下代码吧

char *  strstr (const char * str1, const char * str2)
{
        char *cp = (char *) str1;
        char *s1, *s2;
        if ( !*str2 )
            return((char *)str1);
        while (*cp)
       {
                s1 = cp;
                s2 = (char *) str2;
                while ( *s1 && *s2 && !(*s1-*s2) )
                        s1++, s2++;
                if (!*s2)
                        return(cp);
                cp++;
       }
        return(NULL);
}

2.memmove

ok,下面来看memmove啊,还是首先来看他的定义。

void * memmove ( void * destination, const void * source, size_t num );

话不多说,直接上注意事项

1.和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

还是话不多说直接来栗子

#include <stdio.h>
#include <string.h>
int main ()
{
  char str[] = "memmove can be very useful......";
  memmove (str+20,str+15,11);
  puts (str);
  return 0;
}

 

 还是话不多少,直接上实现代码

void * memmove ( void * dst, const void * src, size_t count)
{
        void * ret = dst;
        if (dst <= src || (char *)dst >= ((char *)src + count)) {
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
               }
       }
        else {
                dst = (char *)dst + count - 1;
                src = (char *)src + count - 1;
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst - 1;
                        src = (char *)src - 1;
               }
       }
        return(ret);
}

3.memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

比较从ptr1ptr2指针开始的num个字节  

栗子

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

int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";

  int n;

  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );

  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

 

ok,我们就不在对这个函数进行实现了,有感兴趣的可以自己试一下。

那么,这篇文章就到这里了,关于这块的内容要就到此为止,下一步我将开始更新与自定义类型有关的博客。

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

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

相关文章

使用GPT4做Leetcode第 102 场双周赛

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

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

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

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

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

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

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

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;课现在…

JetpackCompose从入门到实战学习笔记14——Coli的简单使用

JetpackCompose从入门到实战学习笔记14——Coli的简单使用 1.简介&#xff1a; Coil 是一个 Android官方出的配合Jetpack的图片加载库&#xff0c;通过 Kotlin 协程的方式加载图片。 优点如下&#xff1a; 更快: Coil 在性能上有很多优化&#xff0c;包括内存缓存和磁盘缓存…