当前位置: 首页 > 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...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...