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

C语言:字符函数和字符串函数(一篇拿捏字符串函数!)

目录

求字符串长度:

1. strlen(字符串长度)

长度不受限制函数:

2. strcpy(字符串拷贝)

3. strcat(字符串追加)

4. strcmp(字符串比较)

长度受限制函数:

5. strncpy(字符串拷贝)

6. strncat(字符串追加)

7. strncmp(字符串比较)

字符串查找:

8. strstr(查找字符串子串)

9. strtok(字符串分割)

错误信息报告:

10. strerror(返回错误信息)

字符操作函数:

字符转换:

1. tolower(小写->大写)

2. toupper(大写->小写)

内存操作函数:

1. memcpy(内存拷贝)

2. memmove(内存拷贝)

3. memcmp(内存比较)

4. memset(内存设置)


求字符串长度:

1. strlen(字符串长度)

size_t   strlen ( const char * str );
  str:C 字符串。
返回值:unsigned  int.
1.1 字符串已经 '\0' 作为结束标志 strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数 (不包
含 '\0' )。
1.2 参数指向的字符串必须要以 '\0'结束
1.3 注意函数的返回值为size_t ,是无符号的( 易错 )。
#include <stdio.h>
#include <string.h>int main()
{if ((int)strlen("abc") - (int)strlen("abcdef") > 0){printf("大于\n");}else{printf("小于等于\n");}return 0;
}

长度不受限制函数:

2.strcpy(字符串拷贝)

char*  strcpy(char * destination, const char * source );
        destinatiob:指向要在其中复制内容的目标 数组的指针
  source:要复制的 C 字符串。
2.1 源字符串必须以 '\0' 结束。
2.2 会将源字符串中的 '\0' 拷贝到目标空间。
2.3 目标空间必须足够大,以确保能存放源字符串。
2.4 目标空间必须可变。
#include <stdio.h>
#include <string.h>int main()
{//char arr1[3] = "";//char arr2[] = "hello bit";char* arr1 = "xxxxxxxxxx";char arr2[6] = { 'a', 'b', 'c', 'd', 'e' , '\0'};strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

3.strcat(字符串追加)

char * strcat ( char * destination, const char * source );
       destination:指向目标数组的指针,该数组应包含 C 字符串,并且足够大以包含串联的结果字符串。
        source: 要追加的 C 字符串。这不应与 目标 重叠。
3.1 源字符串必须以 '\0' 结束。
3.2 目标空间必须有足够的大,能容纳下源字符串的内容。
3.3 目标空间必须可修改。
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

4. strcmp(字符串比较)

int strcmp ( const char * str1, const char * str2 );
        
         str1:要比较的 C1 字符串。
 str2:要比较的 C2 字符串。
4.1 标准规定:
        4.1.1 第一个字符串大于第二个字符串,则返回大于 0 的数字
        4.1.2 第一个字符串等于第二个字符串,则返回0
        4.1.3 第一个字符串小于第二个字符串,则返回小于 0 的数字
#include <stdio.h>
#include <string.h>int main()
{int ret = strcmp("bbq", "bcq");if (ret>0)printf(">\n");printf("%d\n", ret);return 0;
}

长度受限制函数:

5. strncpy(字符串拷贝)

char * strncpy ( char * destination, const char * source, size_t num );
        
         destination:指向要在其中复制内容的目标数组的指针。
  source:要复制的 C 字符串。
  num :要从 复制的最大字符数;

                  size_t 是无符号整数类型。

5.1 拷贝 num 个字符从源字符串到目标空间
5.2 如果源字符串的长度小于 num,则拷贝完源字符串之后,在目标的后边追加0,直到num
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[] = "xxx";strncpy(arr1, arr2, 5);return 0;
}

6. strncat(字符串追加)

char * strncat ( char * destination, const char * source, size_t num );
        
         destination:指向目标数组的指针,该数组应包含一个 C 字符串,并且足够大以包含串联的结果字符串,包括其他 null 字符。
        source:要追加的 C 字符串。
   num: 要追加的最大字符数。

                 size_t是无符号整数类型。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef\0yyyyyyyy";char arr2[] = "xxxxxxxxx";strncat(arr1, arr2, 3);return 0;
}

7. strncmp(字符串比较)

int strncmp ( const char * str1, const char * str2, size_t num );
str1:要比较的 C1 字符串。
        str2:要比较的 C2 字符串。
        num:要比较的最大字符数。
size_t是无符号整数类型。
7.1 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcqwertyuiop";char arr2[] = "abcdef";printf("%d\n", strncmp(arr1, arr2, 4));return 0;
}

字符串查找:

8. strstr(查找字符串子串)

char * strstr ( const char *str1, const char * str2);
    str1:要扫描的 C 字符串。
str2:包含要匹配的字符序列的 C 字符串。
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";char* ret = strstr(arr1, arr2);if (ret != NULL)printf("%s\n", ret);elseprintf("找不到\n");return 0;
}

9. strtok(字符串分割)

char * strtok ( char * str, const char * sep );
   str:要截断的 C 字符串。请注意,此字符串是通过分解为较小的字符串(标记)来修改的。或者,可以指定空指针,在这种情况下,函数将继续扫描以前成功调用函数的位置。
        sep :包含分隔符字符的 C 字符串。这些可能因调用而异。
9.1 sep 参数是个字符串,定义了用作分隔符的字符集合。
9.2 第一个参数指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标记。
9.3 strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。 (注:
strtok 函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
9.4 strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在字符串中的位置。
9.5 strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
9.6 如果字符串中不存在更多的标记,则返回 NULL 指针
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "zpengwei@yeah.net@666#777";char copy[30];strcpy(copy, arr);char sep[] = "@.#";char* ret = NULL;for (ret = strtok(copy, sep); ret != NULL; ret=strtok(NULL, sep)){printf("%s\n", ret);}return 0;
}

错误信息报告:

10. strerror(返回错误信息)

char * strerror ( int errnum );
 errnum :错误号。
库函数在执行的时候,发生了错位会将一个错误码存放errno这个变量中errno是C语言提供的一个全局的变量。
10.1 返回错误码,所对应的错误信息。 
#include <stdio.h>
#include <string.h>int main()
{int i = 0;for (i = 0; i < 10; i++){printf("%d: %s\n", i, strerror(i));//}return 0;
}

字符操作函数:

字符串函数
函数
如果他的参数符合下列条件就返回真
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
任何可打印字符,包括图形字符和空白字

字符转换:

1.towlower(小写->大写)

int  tolower ( int c );

        

        c:要转换、转换为 int 或 EOF 的字符。

#include <stdio.h>
#include <ctype.h>int main()
{printf("%c\n", tolower('A'));printf("%c\n", tolower('s'));return 0;
}

2. toupper(大写->小写)

int  toupper ( int c );

        

        c:要转换、转换为 int 或 EOF 的字符。

#include <stdio.h>
#include <ctype.h>int main()
{char arr[20] = { 0 };gets(arr);//遇到空格继续读char* p = arr;while (*p){if (isupper(*p))// *p>='A' && *p<='Z'{*p = tolower(*p);//*p = *p+32;}p++;}printf("%s\n", arr);return 0;
}

内存操作函数:

1. memcpy(内存拷贝)

void * memcpy ( void * destination, const void * source, size_t num );
        
 destination:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
        source:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
        num :要复制的字节数。
size_t 是无符号整数类型。
1.1 函数 memcpy source的位置开始向后复制num字节的数据到destination 的内存位置
1.2 这个函数在遇到 '\0' 的时候并 不会 停下来
1.3 如果 source destination 有任何的 重叠 复制的结果都是未定义的。

#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };//将arr1中的内容,拷贝到arr2中memcpy(arr2, arr1, 40);int*  int*int i = 0;for (i = 0; i < 20; i++){printf("%d ", arr2[i]);}return 0;
}

2. mommove(内存拷贝)

void * memmove ( void * destination, const void * source, size_t num );
        
 destination:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
        source:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
        num : 要复制的字节数。

                  size_t 是无符号整数类型。

2.1 memcpy差别就是memmove 函数处理的源内存块和目标内存块是可以重叠的。
2.2 如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };//             1 2 1 2 3 4 5 8 9 10memmove(arr1, arr1+2, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

3. memcmp(内存比较)

int  memcmp ( const void * ptr1, const void * ptr2, size_t num );
        
         ptr1:指向内存块的指针。
        ptr2:指向内存块的指针。
  num :要比较的字节数。
3.1 比较从 ptr1 ptr2 指针开始的 num个字节;
3.2 返回值如下:

#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1,2,1,4,5,6 };int arr2[] = { 1,2,257 };int ret = memcmp(arr1, arr2, 10);printf("%d\n", ret);return 0;
}

4. memset(内存设置)

void *  memset ( void * ptr1,  int  value,  size_t  num );

        

        ptr1:指向要填充的内存块的指针。

        value:要设置的值。该值作为 int 传递,但该函数使用此无符号 char 转换填充内存块。

        num :要设置为该值的字节数。
                    size_t 是无符号整数类型。

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "hello bit";memset(arr+1,'x',4);//以字节为单位设置的printf("%s\n", arr);return 0;
}

以上就是个人学习见解和学习的解析,欢迎各位大佬在评论区探讨!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                              

相关文章:

C语言:字符函数和字符串函数(一篇拿捏字符串函数!)

目录 求字符串长度&#xff1a; 1. strlen(字符串长度) 长度不受限制函数&#xff1a; 2. strcpy(字符串拷贝) 3. strcat(字符串追加) 4. strcmp(字符串比较) 长度受限制函数&#xff1a; 5. strncpy(字符串拷贝) 6. strncat(字符串追加) 7. strncmp(字符串比较) 字…...

问道管理:成交量买卖公式?

跟着股票商场的如火如荼&#xff0c;人们对于怎么解读和使用成交量进行股票生意的需求日积月累。成交量是指在某一特定时间内进行的股票生意的数量&#xff0c;它是投资者们研判商场状况和制定生意战略的重要指标之一。那么&#xff0c;是否存在一种最厉害的成交量生意公式呢&a…...

【MySQL】5、MySQL高阶语句

一、常用查询&#xff08;增、删、改、查&#xff09; 对 MySQL 数据库的查询&#xff0c;除了基本的查询外&#xff0c;有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等 模板表&#xff1a; 数据库有一张info表&#xff0c;记录了学生…...

【Linux】redhat7.8配置yum在线源【redhat7.8镜像容器内配置yum在线源】通用

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

强大的处理器和接口支持BL304ARM控制器

在智慧医疗领域&#xff0c;BL304可以用于实现医疗设备的智能化、远程监控和数据交换。在智慧电力领域&#xff0c;BL304可以帮助实现电网的智能化管理&#xff0c;提升电力供应的效率。在智慧安防领域&#xff0c;BL304可以实现智能监控、智能门锁等应用&#xff0c;保障安全。…...

react 基础知识(一)

1、 安装1 &#xff08;版本 react 18&#xff09; // 安装全局脚手架&#xff08;create-react-app基于webpackes6&#xff09; npm install -g create-react-app //使用脚手架搭建项目 create-react-app my-app // 打开目录 cd my-app // 运行项目 npm start2、初体验 impo…...

SpringBoot整合JUnit、MyBatis、SSM

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SpringBoot整合 一、SpringBoot整合JUnit二、Spri…...

virtuoso61x中集成calibre

以virtuoso618为例&#xff0c;在搭建完电路、完成前仿工作之后绘制版图&#xff0c;版图绘制完成之后需要进行drc和lvs【仅对于学校内部通常的模拟后端流程而言】&#xff0c;一般采用mentor的calibre来完成drc和lvs。 服务器上安装有virtuoso和calibre&#xff0c;但是打开la…...

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库&#xff0c;其中包括新的集合类型&#xff08;例如 multimap 和…...

Hadoop服务脚本

#!/bin/bash process("NameNode" "SecondaryNameNode" "DataNode" "NodeManager" "ResourceManager") JAVA_HOME"/opt/software/jdk1.8.0_371" HADOOP_HOME"/opt/software/hadoop-3.3.6"# 定义颜色的AN…...

[QT]设置程序仅打开一个,再打开就唤醒已打开程序的窗口

需求&#xff1a;speedcrunch 这个软件是开源的计算器软件。配合launch类软件使用时&#xff0c;忘记关闭就经常很多窗口&#xff0c;强迫症&#xff0c;从网上搜索对版本进行了修改。 #include "gui/mainwindow.h"#include <QCoreApplication> #include <…...

数据库(二) Oracle篇

Oracle SQL常用函数 概述 SQL函数有单行函数和多行函数,其区别为&#xff1a; 单行&#xff1a;输入一行,返回一行,如字符、数字、转换、通用函数等多行&#xff1a;输入多行,返回一行,也称为分组函数、组函数、聚合函数,且多行函数会自动滤空 单行函数 字符函数 CONCAT(…...

TDengine函数大全-目录

TDengine函数大全 详情见具体页面&#xff0c;点击进入。 1.数学函数 ABSACOSASINATANCEILCOSFLOORLOGPOWROUNDSINSQRTTAN 2.字符串函数 CHAR_LENGTHCONCATCONCAT_WSLENGTHLOWERLTRIMRTRIMSUBSTRUPPER 3.转换函数 CAST TO_ISO8601TO_UNIXTIMESTAMPTO_JSON 4.时间和日期…...

代理模式之静态代理

代理模式是一种常见的设计模式&#xff0c;它允许一个对象&#xff08;代理对象&#xff09;代表另一个对象&#xff08;真实对象&#xff09;进行操作。在软件开发中&#xff0c;代理模式被广泛应用于各种场景&#xff0c;例如网络请求的代理、权限控制的代理等。 静态代理是…...

LeetCode——栈的压入、弹出序列

这里我用下面的例子子来讲解一下模拟栈的实现。 例子1&#xff1a;pushed [1,2,3,4,5] popped [4,5,3,2,1] 思路&#xff1a;第一步&#xff1a;我们先创建一个栈&#xff0c;然后将pushed的数据压进去 第二步&#xff1a;判断&#xff01; 当压入栈的数据和popped第一个数据…...

Flutter 逆向安全

前言&#xff1a; 前几天在 "学习" 一个项目&#xff0c; 发现是用 Flutter 开发的。之前研究过 flutter 的逆向&#xff0c;早期 Flutter 有工具可以通过快照进行反编译&#xff1a;《对照表如下》 新的版本开发者没有维护了。 目前没有很好的工具 可以对 Flutter 进…...

【微服务部署】01-Kubernetes部署流程

文章目录 部署1. Kubernetes是什么2. Kubernetes的优势3. 环境搭建4. 应用部署 部署 1. Kubernetes是什么 Kubernetes是一个用于自动部署、扩展和管理容器化应用程序的开源系统 2. Kubernetes的优势 自动化容器部署资源管理与容器调度服务注册发现与负载均衡内置配置与秘钥…...

SPI3+DMA外设驱动-TFTLCD初始化

前言 &#xff08;1&#xff09;本系列是基于STM32的项目笔记&#xff0c;内容涵盖了STM32各种外设的使用&#xff0c;由浅入深。 &#xff08;2&#xff09;小编使用的单片机是STM32F105RCT6&#xff0c;项目笔记基于小编的实际项目&#xff0c;但是博客中的内容适用于各种单片…...

通过chatgpt 学习React的useEffect

定义&#xff1a; useEffect 是 React 中的一个 Hook&#xff0c;它用于处理函数组件中的副作用操作。副作用操作可以包括数据获取、订阅事件、定时器等。 useEffect 接受两个参数&#xff1a;第一个参数是一个回调函数&#xff0c;用于执行副作用操作&#xff1b;第二个参数…...

rabbitMq介绍及使用

点击跳转https://blog.csdn.net/qq_43410878/article/details/123656765...

rabbitmq载在.net中批量消费的问题记录

背景 最近遇到了一个问题&#xff0c;在使用rabbitmq的时候出现了丢消息、消息重复消费等一系列的问题&#xff0c;使用的是.net框架&#xff0c;背景是高并发压力下的mq消费&#xff0c;按理说即使队列中堆了几百条消息&#xff0c;我客户端可以同处理5个消息。 原因是多线程…...

【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

文章目录 RPC 协议gRPCJSON-RPC 数据序列化与反序列化lua-cjsonlua-protobuf RPC 协议 在分布式计算&#xff0c;远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调…...

Flutter的Timer类

文章目录 一、Timer简介Timer类的详细介绍导入dart:async包创建一个定时器取消定时器定时器的周期性执行注意事项 二、Semantics简介Flutter Semantics 的详细介绍SemanticsNode语义标签和标签形状语义属性自定义语义行为通过语义树导航 一、Timer简介 Flutter的Timer类是Dart…...

Chrome小恐龙快跑小游戏——Python实现

目录 视频演示 代码实现 视频演示 Chrome小恐龙快跑小游戏——Python实现 代码实现 import pygame import os import random pygame.init()# Global Constants SCREEN_HEIGHT 600 SCREEN_WIDTH 1100 game_over False SCREEN pygame.display.set_mode((SCREEN_WIDTH, SCR…...

Web网站服务器

目录 一、什么是Apache? 二、虚拟目录是什么&#xff1f; 三、Apcahe相关配置文件 四、httpd.conf主配置文件的常用配置参数 五、Web网站配置案例 5.1搭建基于用户的个人主页网站 5.2、配置虚拟目录 5.3、配置虚拟主机 5.3.1搭建两个基于IP地址的虚拟主机 5.3.2搭建两个基于域…...

Docker consul 容器服务自动发现和更新

目录 一、什么是服务注册与发现 二、Docker-consul集群 1.Docker-consul consul提供的一些关键特性 2.registrator 3.Consul-template 三、Docker-consul实现过程 以配置nginx负载均衡为例 先配置consul-agent &#xff0c;有两种模式server和client 四、Docker-cons…...

CentOS 8 执行yum命令报错:Failed to set locale, defaulting to C.UTF-8

今天Docker新搞了一个CentOS镜像&#xff0c;在运行基于该镜像的容器&#xff0c;执行yum命令时&#xff0c;遇到了如下报错&#xff1a; [rootGC Administrator]# yum install -y yum-utils Failed to set locale, defaulting to C.UTF-8 CentOS Linux 8 - AppStream …...

8. 损失函数与反向传播

8.1 损失函数 ① Loss损失函数一方面计算实际输出和目标之间的差距。 ② Loss损失函数另一方面为我们更新输出提供一定的依据。 8.2 L1loss损失函数 ① L1loss数学公式如下图所示&#xff0c;例子如下下图所示。 import torch from torch.nn import L1Loss inputs torch.tens…...

Angular安全专辑之四 —— 避免服务端可能的资源耗尽(NodeJS)

express-rate-limit是一个简单实用的npm包,用于在Express应用程序中实现速率限制。它可以帮助防止DDoS攻击和暴力破解,同时还允许对API端点进行流控。 express-rate-limit及其主要功能 express-rate-limit是Express框架的一个流行中间件,它允许根据IP地址或其他标准轻松地对请求…...

Servlet学习总结(Request请求与转发,Response响应,Servlet生命周期、体系结构、执行流程等...)

Override 是Java中的注解&#xff08;Annotation&#xff09;&#xff0c;它用于告诉编译器该方法是覆盖&#xff08;重写&#xff09;父类中的方法。当我们使用Override注解时&#xff0c;编译器会检查当前方法是否正确地覆盖了父类中的方法&#xff0c;如果没有覆盖成功&…...