当前位置: 首页 > news >正文

字符串函数(一)

图片来源于网络

✨博客主页:小钱编程成长记
🎈博客专栏:进阶C语言

字符串函数(一)

  • 0.前言
  • 1.求字符串长度的函数
    • 1.1 strlen(字符串长度)
  • 2.长度不受限制的字符串函数
    • 2.1 strcpy(字符串拷贝)
    • 1.3 strcat(字符串追加)
    • 2.3 strcmp(字符串比较)
  • 总结

0.前言

  • C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串或者字符数组中。
  • 字符串常量适用于那些多它不做修改的字符串函数。
小知识:

assert断言,需要头文件assert.h 。是用来判断表达式的值不能为某值的。若表达式为假,会报错,而且会指出错误的位置,提醒你修改。

字符串函数的头文件都是string.h

1.求字符串长度的函数

1.1 strlen(字符串长度)

具体介绍链接

size_t strlen (const char *str);
注:
  • 字符串已 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
  • 参数指向的字符串必须要以 ‘\0’ 结束,否则返回的结果为随机值。
  • 注意函数的返回类型为size_t,是无符号整型( 易错 ),用%zd打印。
  • 学会strlen函数的模拟实现
注意:
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) >= 0)//因为strlen返回类型是size_t(无符号整型),所以差也是无符号整型,无符号整型一定>=0。{printf(">=");}else{printf("<");}return 0;
}

若将返回值强转为整型,差就为-3,打印出<
在这里插入图片描述

strlen的模拟实现的三种方法:

  1. 计数器
#include <stdio.h>
#include <assert.h>size_t my_strlen1(const char* str)//str指向的字符不需要修改,可以加上const保护字符,防止其被修改
{assert(str);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改int count = 0;while(*str++)   // ==  if(*str++ != \0){count++;}return count;
}int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen1(arr));//链式访问(一个函数的返回值是另一个函数的参数)return 0;
}
  1. 递归
#include <stdio.h>
#include <assert.h>size_t my_strlen2(const char* str)//str指向的字符不需要修改,可以加上const保护字符,防止其被修改
{assert(str);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改if (*str != '\0'){return my_strlen2(str + 1) + 1;}else{return 0;}
}int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen2(arr));//链式访问(一个函数的返回值是另一个函数的参数)return 0;
}
  1. 指针 - 指针
#include <stdio.h>
#include <assert.h>size_t my_strlen3(const char* str)//str指向的字符不需要修改,可以加上const保护字符,防止其被修改
{assert(str);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改char *start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "abcdef";size_t len = my_strlen3(arr);printf("%zd\n", len);//链式访问(一个函数的返回值是另一个函数的参数)return 0;
}

2.长度不受限制的字符串函数

不关心目标空间够不够大
不关心操作字符串的长度

2.1 strcpy(字符串拷贝)

具体介绍链接

char* strcpy(char *destination, const char *source);
介绍:

Copies the C string pointed by source into the array pointed by
destination, including the terminating null character (and stopping at that point).
将源指向的 C 字符串复制到目标指向的数组中,包括终止的 null(‘\0’) 字符(并在该点停止)。

注:
  • 源字符串必须以 ‘\0’ 结束。
    在这里插入图片描述
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
    在这里插入图片描述
  • 目标空间必须足够大,以确保能存放源字符串。(否则会报错)
    在这里插入图片描述
  • 目标空间必须可变。(因为要把另一个字符串拷贝到这里)
  • 返回值是目标空间的起始地址,然后通过%s来打印,%s是从给的地址开始 *解引用打印,遇到’\0’结束
  • 学会模拟实现。

    模拟实现strcpy:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* destination, const char* source)
//source指向的源字符串不需要改变,可以用const保护起来
//destination指向的目标空间必须可变,不能用const修饰{assert(destination && source);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改char* start = destination;while (*destination++ = *source++)//当*source=='\0'时,整个表达式的结果为'\0',//又因为'\0'的ASCII码(在内存中存储的I)是0,所以为假,循环结束{;}return start;
}int main()
{char arr1[20] = "xxxxxxxxxx";char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);//或printf("%s\n", my_strcpy);return 0;
}

1.3 strcat(字符串追加)

具体介绍链接

char * strcat ( char * destination, const char * source );
介绍:

将源字符串追加到目标字符串中,源字符串的结束标志 ‘\0’ 被 source的第一个字符覆盖,并且在两者串联形成的新字符串的末尾包含一个’\0’(相当于将源字符串的’\0’也追加过去) 。

注:
  • 目标空间必须要有’\0’,保证能找到目标空间的末尾,进行追加。(编译器认为从左到右第一个’\0’是字符串的末尾)

  • 源字符串必须以 ‘\0’ 结束。(在追加时源字符串的’\0’也追加过去)
    在这里插入图片描述

  • 目标空间必须有足够的大,能容纳下源字符串的内容。

  • 目标空间必须可修改。

  • strcat返回的是目标空间的起始地址。

  • 学会模拟实现。

    模拟实现strcat :

//模拟实现strcat
#include <stdio.h>
#include <assert.h>char* my_strcat(char* des, const char* sou)
{char* start = des;assert(des && sou);//断言//1.找到目标字符串的末尾('\0')while (*des)//找到末尾'\0'后跳出循环{des++;}//2.数据追加while (*des++ = *sou++)//将源字符串的末尾'\0'拷贝过去的同时也结束拷贝{;}return start;
}int main()
{char arr1[20] = "abc";char arr2[] = "def";my_strcat(arr1, arr2);printf("%s\n", arr1);//printf("%s\n", strcat(arr1, arr2));return 0;
}
  • 字符串自己给自己追加,会发生什么呢?
  1. 若用刚刚自己模拟的函数追加,会死循环。
    在这里插入图片描述

在这里插入图片描述
2. 用vs自带的库函数却能正常追加
在这里插入图片描述
这说明vs库函数中strcat的实现方式和自己的实现方式有所差异,其实不同编译器对库函数的实现方式都可能有所差异。所以stccat在VS上能自己追加自己,但其他编译器不一定可以。
若非要自己追加自己,建议使用strncat。

2.3 strcmp(字符串比较)

具体介绍链接

int strcmp ( const char * str1, const char * str2 );
介绍:
  1. 此函数开始比较每个字符串的第一个字符,如果它们相等,则继续向下比较,直到字符不同或达到终止空字符(‘\0’)
  2. 比较的不是长度,而是对应位置上字符的大小ASCII码,因为字符在内存中是以ASCII码的形式存储的)
C语言标准规定:
返回值(整型)解释
大于 0第一个字符串大于第二个字符串
0第一个字符串等于第二个字符串
小于 0第一个字符串小于第二个字符串
不同的编译器具体返回的值不同
模拟实现strcmp :
//模拟实现strcmp
#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);//断言,防止为空指针while (*str1 == *str2){if (*str1 == '\0')//同时为'\0'时,两个字符串才相等{return 0;}str1++;str2++;}return *str1 - *str2;//或//if (*str1 > *str2)//{//	return 1;//}//else//{//	return -1;//}}int main()
{char arr1[] = "abcdef";char arr2[] = "abp";if (my_strcmp(arr1, arr2) > 0){printf(">\n");}else if(my_strcmp(arr1, arr2) == 0){printf("=\n");}else{printf("<\n");}return 0;
}

在这里插入图片描述

从这分成两篇博文:

总结

我们一起学习了计算字符串长度的函数和长度不受限制的字符串函数。
感谢大家的阅读,大家一起进步!

点赞收藏加关注,C语言学习不迷路!
图片来源于网络

相关文章:

字符串函数(一)

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 字符串函数&#xff08;一&#xff09; 0.前言1.求字符串长度的函数1.1 strlen&#xff08;字符串长度&#xff09; 2.长度不受限制的字符串函数2.1 strcpy&#xff08;字符串拷贝&#xff0…...

Ubuntu 安装 Docker 的详细步骤

文章目录 简介1.更新2.安装必要的软件包2.1 基于阿里源 3.验证 Docker 安装是否成功4.安装后的一些常规设置及常用的命令4.1 启动 Docker4.2 Docker 在系统启动时自动运行4.3 运行一个 Hello World 镜像4.4 查看docker运行状态 欢迎来到这篇关于在 Ubuntu 上安装 Docker 的教程…...

使用Python进行App用户细分

App用户细分是根据用户与App的互动方式对用户进行分组的任务。它有助于找到保留用户&#xff0c;找到营销活动的用户群&#xff0c;并解决许多其他需要基于相似特征搜索用户的业务问题。这篇文章中&#xff0c;将带你完成使用Python进行机器学习的App用户细分任务。 App用户细…...

博弈论——伯特兰德寡头模型(Bertrand Model)

伯特兰德寡头模型(Bertrand Model) 0 引言 在前面几篇文章中&#xff0c;我们介绍了古诺模型(Cournot duopoly model)和斯塔克尔伯格模型(Stackelberg model) 博弈论——连续产量古诺模型(Cournot duopoly model) 博弈论——斯塔克尔伯格模型(Stackelberg model) 这两个模型…...

第一百六十回 SliverPadding组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverAppBar组件相关的内容&#xff0c;本章回中将介绍 SliverPadding组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的SliverPadding组件类似Pading组件&#xff0c;它主要用…...

Mapfree智驾方案,怎样实现成本可控?

整理|睿思 编辑|祥威 编者注&#xff1a;本文是HiEV出品的系列直播「智驾地图之变」第二期问答环节内容整理。 元戎启行副总裁刘轩与连线嘉宾奥维咨询董事合伙人张君毅、北汽研究总院智能网联中心专业总师林大洋、主持嘉宾周琳展开深度交流&#xff0c;并进行了答疑。 本期元…...

javascript: Bubble Sort

// Sorting Algorithms int JavaScript /** * file Sort.js * 1. Bubble Sort冒泡排序法 */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i){swapped false;for (j 0; j < nszie - i - 1; j){if (arry[j] > arry[j …...

DM数据库根据rowid删除重复的记录

oracle中rowid的用法-CSDN博客 delete from stu a where rowid not in (select max(b.rowid) from stu b where a.nob.no and a.name b.name and a.sex b.sex); //这里max使用min也可以...

【AI视野·今日Robot 机器人论文速览 第四十期】Mon, 25 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 25 Sep 2023 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;CloudGripper, 一套云化的机器抓取人数据采集系统&#xff0c;包含了32个机械臂的集群。(from KTH Royal Institute of Te…...

HashMap底层源码,数据结构

HashMap的底层结构在jdk1.7中由数组链表实现&#xff0c;在jdk1.8中由数组链表红黑树实现&#xff0c;以数组链表的结构为例。 JDK1.8之前Put方法&#xff1a; JDK1.8之后Put方法&#xff1a; HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在&#xff0c…...

计算机等级考试—信息安全三级真题八

一、单选题...

番外6:下载+安装+配置Linux

#########配置Linux---后续 step08: 点击编辑虚拟机设置&#xff0c;选择下载好的映像文件.iso进行挂载&#xff1b; step09: 点击编辑虚拟机选项&#xff0c;选择UEFI启动模式并点击确定&#xff1b; step10: 点击开启虚拟机&#xff0c;选择Install rhel &#xff1b; 备注&…...

javascript验证表单字段有效性,使用checkValidity()方法和他的属性

<script type"text/javascript">function LoginCheckValidity(){var txt"";var rmb1document.getElementById("rmb1");if(rmb1.checkValidity()false){if(rmb1.validitionMessageundefined){txt"输入金额有误,金额10-200之间";}…...

pdf怎么调整大小kb?pdf文件过大这样压缩

在日常的工作和生活中&#xff0c;我们常常会遇到需要调整PDF文件大小的问题。有时候&#xff0c;我们需要将大型的PDF文件上传到某些平台&#xff0c;但平台的限制让我们不得不压缩文件的大小。那么&#xff0c;如何有效地调整PDF文件的大小呢&#xff1f; 一、使用嗨格式压缩…...

vue3中的watch

在Vue3中&#xff0c;watch中的参数可以分为两部分&#xff0c;即要监听的响应式数据以及回调函数。 语法格式如下&#xff1a; watch(要监听的响应式数据, 回调函数)除了以上的两个还有其他的参数 immediate&#xff1a;是否在初始化时立即执行一次回调函数&#xff0c;默认…...

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…...

番外5:下载+安装+配置Linux

任务前期工作&#xff1a; 01. 电脑已安装好VMware Workstation软件&#xff1b; 02.提前下载好Rhel-8.iso映像文件&#xff08;文件较大一般在9.4GB&#xff0c;建议采用迅雷下载&#xff09;&#xff0c;本人使用的以下版本&#xff08;地址ed2k://|file|rhel-8.4-x86_64-dvd…...

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程

前言 今天是国庆节&#xff0c;我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言&#xff0c;那么学习一门语言&#xff0c;光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码&#xff0c;就要像C语言那样搭建起语言的编译环境&…...

python监控软件内存、cpu和GDI

目录 前言代码 前言 最近做软件测试需要监控软件内存、cpu和GDI对象数&#xff0c;用psutil库可以很方便的实现监控内存和CPU&#xff0c;但是GDI好像还不行&#xff0c;最后来的win32api来调用的Windows API接口来实现GDI监控的&#xff0c;在此做个记录。 代码 import psu…...

wordpress搭建自己的博客详细过程以及踩坑

WordPress作为一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;具有诸多优势。首先&#xff0c;它的易用性使得即使对于没有编程经验的用户来说也能轻松上手&#xff0c;通过直观的用户界面和友好的管理工具&#xff0c;用户可以方便地创建、编辑和发布内容。其…...

在jupyter中更改、增加内核

今天在配置llama2的环境&#xff0c;在学院实验室的服务器上面用jupyter&#xff0c;怎么都不会增加内核。今天说一下怎么把创建好的conda环境增加到jupyter列表中。 例如我有个环境叫做llama2&#xff0c;很简单只要两步。 第一步先激活conda环境。 conda activate llama2第…...

Redis代码实践总结(二)

使用 CLI 探索 Redis 外部程序使用 TCP 套接字和 Redis 特定协议与 Redis 进行通信。该协议在不同编程语言的 Redis 客户端库中实现。然而&#xff0c;为了使使用 Redis 进行黑客攻击变得更简单&#xff0c;Redis 提供了一个命令行实用程序&#xff0c;可用于向 Redis 发送命令…...

读取一张图片各种颜色占比

提问之初 <small> 读取一张图片各种颜色占比 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg有趣优雅热情沉着的代码与注释/每行每行 from PIL import Image # 导入PIL大法&#xff0c;这是处理图像的必备神器# 图片路径&#xff0c;此处为…...

C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强

前言&#xff1a;在第三章我们介绍了顺序结构程序设计。在顺序结构中&#xff0c;各个语句是按自上而下的顺序执行的&#xff0c;执行完上一个语句就自动执行下一个语句&#xff0c;是无条件的&#xff0c;不必做任何判断。是这最简单的程序结构。实际上&#xff0c;在很多情况…...

Blued引流脚本

于多数人来说&#xff0c;引流都是一个比较困难的操作&#xff0c;因为流量不会听你的。所以任何人在网上做生意&#xff0c;或者开一个实体店&#xff0c;都会为流量而发愁&#xff0c;其实对于流量的吸引来说&#xff0c;我们越是刻意为之&#xff0c;可能所获得的效果也越不…...

数据结构之美:如何优化搜索和排序算法

文章目录 搜索算法的优化1. 二分搜索2. 哈希表 排序算法的优化1. 快速排序2. 归并排序 总结 &#x1f389;欢迎来到数据结构学习专栏~数据结构之美&#xff1a;如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x…...

Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

效果 直接将脚本挂载在Text Mesh Pro上&#xff0c;但是需要滚动的文本必须在Scroll View中&#xff0c;否侧会定位错误&#xff0c;还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…...

GNN PyG~torch_geometric 学习理解

目录 1. PyG Introduction 2. PyG Installation 2.1 PyG 安装常见错误及原因 2.2 PyG 具体安装步骤 3. torch_geometric packages torch_geometric.data.Data Dataset 与 DataLoader Dropout、BatchNorm 3. torch_geometric: 理解edge_index 3.1 理解 mini-batch edg…...

ChatGPT 调教指南:从 PDF 提取标题并保存

一、请使用python编写一段代码&#xff0c;使用pymupdf包从pdf中提取标题&#xff0c;保存标题名称和页数。 我没有加任何的答案提示&#xff0c;看看 GPT 如何反应。它应该是知道 PDF 没有任何语义信息&#xff0c;一切标题或者正文全是文本框。 好的&#xff0c;以下是使用py…...

【day10.01】使用select实现服务器并发

用select实现服务器并发&#xff1a; linuxlinux:~/study/1001$ cat server.c #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8880#define IP "192.168.31.38"int main(int argc, c…...

建站吗官方网站/商丘 峰少 seo博客

1.常函数成员&&常数据成员 const位于函数声明后面,声明和定义时都要加&#xff1b; 进行函数调用时不能加const; 常对象只能调用常函数成员; const成员函数既可引用const数据&#xff0c;也可引用非const数据&#xff0c;但都不能改变值。 const函数成员不能访问非c…...

芜湖网络公司/seo优化中商品权重主要由什么决定

GPT开启AI大模型时代&#xff0c;国内外大厂发力布局&#xff0c;商业化空间加速打开&#xff1a;1、数据、算法、模型三轮驱动AI发展&#xff0c;大模型优势显著&#xff0c;成为AI主流方向&#xff1b;2、GPT开启千亿参数级AI大模型时代&#xff0c;语言、视觉、科学计算等大…...

新疆网络干部学院平台/潍坊seo建站

前言 本游戏纯属搞笑&#xff0c;你可以把你朋友的照片设置成贪吃蛇的蛇头&#xff0c;你们看最终结果就知道啦 相关文件 大家可以关注小编的公众号&#xff1a;Python日志 里面会不定时的发布一下Python小知识和一些高校有的源码的 源码获取可以在公众号里面回复&#xff1…...

苏州h5网站/网站关键词快速排名工具

《爱上统计学》笔记 相关系数&#xff1a; 当一个变量发生变化时&#xff0c;另一个变量如何变化。相关系数是反映两个变量之间关系的量化指标&#xff0c;值域范围-1到1。反映变量发生变化时&#xff0c;变化的方向是相反的还是相同的。如果相同&#xff0c;则是直接相关或正…...

关于网站的建设论文/建个网站需要多少钱

传送门&#xff1a;https://loj.ac/problem/10145 简单的平衡树 ———————————————————————————————————— 1 #include<bits/stdc.h>2 using namespace std;3 const int maxn1e510;4 int n,minv,lk;5 struct node6 {7 int val,lc,r…...

哪个公司的微信商城系统/无锡百度快照优化排名

以前没有接触过CXF&#xff0c;项目需要学习&#xff0c;从网上各种找资料加上项目的实践&#xff0c;不断垒字。 CXF &#xff08;Celtix XFire&#xff09;是一个开源的Services框架。CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services &#xff0c;像 JAX-WS 。这些…...