字符串函数———C语言

news2024/11/25 22:49:11

1. 求字符串的长度

strlen

原型:size_t strlen(const char *str);

原理:字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0')参数指向的字符串必须要以'\0'结束

#include <stdio.h>
#include <string.h>
int main(){
    char a[] = "bvsklvjrughkvsknln";//这里就是一个字符串了
    printf("The strlen of a = %d",strlen(a));
    return 0;
}

注意:函数的返回值为size_t,是无符号的(unsigned int)

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

a:strcpy

原型:char * strcpy ( char * destination, const char * source );

原理:strcpy 会从源字符串 src 开始,一个字符一个字符地复制到目标字符串 dest 中,直到遇到字符串结束符 \0,然后在 dest 也追加一个 \0 来标识字符串的结束。

目标空间(即 dest不可变化,必须在复制操作前预先分配足够的内存空间。如果目标空间的大小不足以容纳源字符串,则可能导致缓冲区溢出等严重错误。

#include <stdio.h>
#include <string.h>
int main() {
    char src[] = "Hello, World!";
    char dest[50];  // 确保目标缓冲区足够大,能够容纳源字符串
    strcpy(dest, src);
    printf("Copied string: %s\n", dest);
    return 0;
}

b:strcat

原型:char * strcat ( char * destination, const char * source );

原理:strcat 从目标字符串 dest 的末尾(即第一个 \0 位置)开始,将源字符串 src 逐字符追加到 dest 后面,并在连接后的字符串末尾添加一个新的 \0 结束符。

注意:使用 strcat 时,目标字符串 dest 必须预留足够的空间, 以便容纳追加后的字符串。 由于strcat 不会自动检查 dest 的剩余空间是否足够,可能会导致缓冲区溢出和潜在的程序崩溃。  

#include <stdio.h>
#include <string.h>
int main() {
    char dest[50] = "Hello, ";  // 确保 dest 的大小足够容纳两个字符串
    char src[] = "World!";
    strcat(dest, src);
    printf("Concatenated string: %s\n", dest);
    return 0;
}

c:strcmp

原型:int strcmp ( const char * str1, const char * str2 );

原理:

  • 第一个字符串大于第二个字符串时,则返回大于0的数字
  • 第一个字符串等于第二个字符串时,则返回0
  • 第一个字符串小于第二个字符串时,则返回小于0的数字
#include <stdio.h>
#include <string.h>
int main(){
    char a[] = "bvsklvjrughkvsknln";
    char b[] = "bvsklvjrughkvsknln";
    printf("The strlen of a = %d\n",strlen(a));
    printf("The strlen of a = %d\n",strlen(b));
    printf("strcmp = %d\n",strcmp(a,b));//返回结果是0
    return 0;
}

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

1.strncpy

原型:char * strncpy ( char * destination, const char * source, size_t num );

原理:拷贝num个字符从源字符串到目标空间,如果源字符串的长度小于num,则补'\0'

#include <stdio.h>
#include <string.h>
int main() {
    char str[256] = { 0 };
    char str1[] = "hello";
    char str2[] = "delicious";
    printf("str2=%s", str2);//说明把之前的替换了
    // 复制hell
    strncpy(str, str1, 4);
    printf("str=%s\n", str);
    // 复制hello\0\0
    strncpy(str2, str1, 7);
    printf("str2=%s", str2);
    // hello
    return 0;
}

2.strncat

原型:char * strncat ( char * destination, const char * source, size_t num );

原理:将一个字符串的指定数量的字符追加到另一个字符串的末尾。与 strcat() 不同的是,strncat() 限制了追加的字符数量,防止超出目标字符串的缓冲区大小。

#include <stdio.h>
#include <string.h>
int main() {
    char str[256] = "hello\0xxxxxxxxxx";
    char str1[] = "world";
    // 拷贝str1的3个字符到str的结尾
    strncat(str,str1,3);
     printf("str=%s\n",str);
    // hellowor
    return 0;
}

3.strncmp

原型:int strncmp ( const char * str1, const char * str2, size_t num );

原理:比较两个字符串的前 n 个字符(有一定的限制才能防止内存溢出)与 strcmp() 函数不同,strncmp() 允许你指定比较的字符数,帮助你在部分字符串中进行比较。

#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "Hello, World!";
    char str2[] = "Hello, everyone!";   
    // 比较前 5 个字符
    int result = strncmp(str1, str2, 5);    
    if (result == 0) {
        printf("The first 5 characters are the same.\n");
    } else if (result < 0) {
        printf("str1 is less than str2 in the first 5 characters.\n");
    } else {
        printf("str1 is greater than str2 in the first 5 characters.\n");
    }    
    return 0;
}

4. 字符串查找

strstr

原型:char *strstr(const char *haystack, const char *needle);

原理:strstr()haystack 的开头开始,逐字符检查是否存在 needle。一旦找到匹配的 needle,它就会返回指向 needlehaystack 中第一次出现的位置的指针。如果找到 needle,返回指向它的指针;如果未找到,则返回 NULL

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    char *result = strstr(str, "World");
    if (result) {
        printf("Found: %s\n", result);
    } else {
        printf("Not found.\n");
    }
    return 0;
}

strtok

原型 :char *strtok(char *str, const char *delim);

原理: 传入字符串 strstrtok() 会扫描字符串,找到并返回第一个标记的指针。传入 NULL 作为 str 参数,strtok() 会继续从上一次停止的位置分割并返回下一个标记的指针。返回指向每个标记的指针,最后一次调用时返回 NULL

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World! Let's tokenize this.";
    char *token = strtok(str, " ,.!");//使用指针获取每个被截取到的字符串
    while (token != NULL) {
        printf("Token: %s\n", token);
        token = strtok(NULL, " ,.!");  // 继续分割传入NULL即可
    }
    return 0;
}

5. 错误信息报告

strerror

原型:char *strerror(int errnum);

原理:传入错误代码 errnumstrerror() 会返回对应的错误消息字符串。 返回指向静态错误消息字符串的指针。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
    }
    return 0;
}

  • 这是本人的学习笔记不是获利的工具,小作者会一直写下去,希望大家能多多监督
  • 文章会每攒够两篇进行更新发布(受平台原因,也是希望能让更多的人看见)
  • 感谢各位的阅读希望我的文章会对诸君有所帮助

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

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

相关文章

配置策略路由实战 附带基础网络知识

背景 作为一个软件开发人员&#xff0c;不可能做到只负责业务开发工作&#xff0c;一旦功能上线或者系统切换就会遇到非常多考验开发人员个人能力的场景&#xff0c;网络调整就是非常重要的一个方面&#xff0c;如果你在系统上线的过程中无法处理一些简单的网络问题或者听不懂…

SpringBoot的内置缓存以及整合第三方缓存

一、什么是缓存 企业级应用主要作用是信息处理&#xff0c;当需要读取数据时&#xff0c;由于受限于数据库的访问效率&#xff0c;导致整体系统性能偏低。 应用程序直接与数据库打交道&#xff0c;访问效率低 为了改善上述现象&#xff0c;开发者通常会在应用程序与数据库之间建…

【避雷】Fomepay跑路大揭秘!还我q来!

震惊&#xff01;Fomepay公司一夜之间消失无踪&#xff0c;用户资金不翼而飞&#xff01; 首先&#xff0c;讲一下我自己的经历&#xff0c;想使用fomepay开卡订阅gpt&#xff0c;充值两百多后&#xff0c;想提现客服直接跑路&#xff01;充多少吞多少&#xff01;骗子公司&am…

Linux pstree 命令详解

pstree 命令是一个在 Unix-like 系统中用于以树状图的形式显示当前运行的进程的命令。这种展示方式比简单的列表&#xff08;ps查看&#xff09;更加直观&#xff0c;有助于用户快速理解进程的层次结构和父子关系。 在诊断系统问题时&#xff0c;pstree 可以帮助确定哪些进程是…

预警先行,弯道哨兵让行车更安全

预警先行&#xff0c;弯道哨兵让行车更安全”这句话深刻体现了现代交通安全理念中预防为主、科技赋能的重要性。在道路交通中&#xff0c;尤其是复杂多变的弯道区域&#xff0c;交通事故的发生率往往较高&#xff0c;因此&#xff0c;采取有效的预警措施和引入先进的交通辅助设…

windows bash获取一个目录下所有的文件

在Windows系统中&#xff0c;我们可以使用命令行工具来获取文件夹下的所有文件名。具体操作如下&#xff1a; 1. 打开命令提示符&#xff08;WinR&#xff0c;输入cmd&#xff0c;回车&#xff09;&#xff1b; 2. 进入需要提取文件名的文件夹&#xff08;使用cd命令&#xf…

从0开始搭建个人博客《第十一期:优化网站访问速度》

目录 一、背景说明 二、Nginx性能优化 &#xff08;一&#xff09;文件句柄 1.系统全局性修改和用户局部性修改 2.进程局部性修改 &#xff08;二&#xff09;CPU亲和配置 1.设置工作进程数 2.设置连接数 &#xff08;三&#xff09;事件处理模型优化 &#xff08;四&…

VisualStudio:模块概念、引用概念及方法、Debug与Release说明

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 今天学习VisualStudio软件的相关内容&#xff0c;以下为学习笔记。 01 模块的概念 模块通常是按照功能划分组成的各个类库或可启动项。 一个模块可以是一个类库&#xff0c;也可以是多个类库&#xff0c;还可以包括…

【机器学习】经典CNN架构

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 经典CNN架构1. 引言2. LeNet3. AlexNet4. VGGNet5. GoogLeNet(Inception)6. Res…

世上最简单的安装jenkins

注意&#xff1a;本次安装的jenkins只支持jdk1.8版本 下载地址&#xff08;jenkins版本2.346&#xff09;&#xff1a; https://mirrors.jenkins-ci.org/war/2.346/ 1、在本地电脑jenkins.war包存放地址里面新建run.bat文件 内容&#xff1a;java -jar D:\install\jenkins\…

宝塔安装python新版本并使用

情况说明&#xff1a; 不是切换宝塔面板默认的 python 而是单独安装一个python版本&#xff0c;然后通过 终端 或者PHP的 shell_exec 方法可以调用。我当前宝塔面板默认的python版本是3.6.8&#xff0c;由于需要用到的python库只支持3.8以上&#xff0c;所以要安装新的python版…

【Java】——Java程序实现学生成绩输入与等级划分

在本文中&#xff0c;我们将介绍如何使用Java编写一个简单的程序&#xff0c;用于输入学生的成绩并划分等级。这个程序可以实现以下功能&#xff1a; 输入学生人数。输入每个学生的成绩。计算最高分。根据最高分划分成绩等级。输出每个学生的分数和对应的等级。 首先&#xff…

SAP B1 三大基本表单标准功能介绍-业务伙伴主数据(四)

背景 在 SAP B1 中&#xff0c;科目表、业务伙伴主数据、物料主数据被称为三大基本表单&#xff0c;其中的标准功能是实施项目的基础。本系列文章将逐一介绍三大基本表单各个字段的含义、须填内容、功能等内容。 附上 SAP B1 10.0 的帮助文档&#xff1a;SAP Business One 10…

数学建模学习(115):主成分分析(PCA)与Python实践

文章目录 一.主成分分析简介1.1 数学背景与维度诅咒1.2 PCA的定义与应用二.协方差矩阵——特征值和特征向量三.如何为数据集选择主成分数量四.特征提取方法五.LDA——与PCA的区别六.PCA的应用七.PCA在异常检测中的应用八.总结一.主成分分析简介 1.1 数学背景与维度诅咒 主成成…

【Python爬虫】教你追剧看电影不求人!python爬虫代码教你爬取各平台视频,小白也能学会!附源码

看剧看一半不是VIP就是svip&#xff0c;正当我们看的津津有味的时候&#xff0c;让你冲米弹窗出来了&#xff01;&#xff01;&#xff01; 对于大家来说&#xff0c;想看续集&#xff0c;都是全凭实力刷续集。 如果这时候你会Python的话&#xff0c;那就不会有这些烦恼了&…

安卓开发中的Jetpack Compose

本文内容总结自郭神的jetpack compose专栏 &#xff0c;整理自学&#xff0c;未完持续... 一、了解Jetpack Compose Compose是一个由Google Android团队官方推出的声明式UI框架&#xff0c;Compose也是属于AndroidX的一部分&#xff0c;它的本质就是用来编写界面以及处理与用户…

【数据结构】二叉树的深度理解

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes 前言 在之前学习了二叉树的基本概念&#xff0c;但二叉树有着更深入知识理解&#xff0c;这篇文章可以帮助大…

Java语言程序设计——篇十六

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

ROBOT--空心杯电机是什么

空心杯电机是什么 1. 简介2. 结构3. 主要特点4. 应用场合5. 优点6. 缺点 1. 简介 空心杯电机是一种微型伺服直流电机&#xff0c;由定子和转子两大核心部分组成&#xff0c;通常来讲尺寸一般较小通常不超过40mm。在结构上突破了传统直流电机的结构形式&#xff0c;采用的是无铁…

如何理解递归

在二叉树的题目中&#xff0c;我们难免会用到递归方法&#xff0c;递归思想很简单&#xff0c;但运用起来却因为抽象而难以理解。 理解递归的关键在于认识到它是一种解决问题的方法&#xff0c;允许函数直接或间接地调用自身。以下是对递归的概述以及如何理解它的几个要点&…