C语言-字符串操作函数-附加使用方式

文章目录

  • 前言
    • 字符串复制-strcpy
    • 字符串复制(按照位数)-strncpy
    • 字符串比较-strcmp
    • 字符串比较(按照位数)-strncmp
    • 不区分大小写的字符串比较-strcasecmp
    • 不区分大小写的比较(前n位)-strncasecmp
    • 字符串按照格式写入-sprintf
    • 字符串按照格式和个数写入-snprintf
    • 字符串拼接-strcat
    • 字符串拼接(前n位)-strncat
    • 字符串切割-strtok
    • 字符串切割-strsep
    • 查找字符串是否在另一个字符串中-strstr
    • 查找字符串是否在另一个字符串中-不区分大小写-strcasestr
    • 查找某个字符是否在字符串中-strchr
    • 字符串转数字-atoi
    • 在字符串提取前面的数字字符并转换成数字(根据参数选择转换后的数字类型)-strtoul
    • 判断字符是否为空-isspace
    • 检查字符是否是十进制数字字符-isdigit

前言

当前文档为C语言字符串的基本操作(用过的以及man时发现的),用于本人记录使用,会持续更新

字符串复制-strcpy

#include <string.h>
char *strcpy(char *dest, const char *src);

// 将后面的变量赋值给前面
// 函数返回一个指向目标字符串dest的指针。
// 需要注意前面变量的长度,要大于等于 后面的长度,要不然编译报警告,还容易越界后报错

字符串复制(按照位数)-strncpy

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);

// 将后面的字符串赋值给前面的字符串 复制 n 个
// 函数返回一个指向目标字符串dest的指针。

字符串比较-strcmp

#include <string.h>
int strcmp(const char *s1, const char *s2);

// 字符串比较,完整比较
// 比较方式为 按照字符串每个字符的ASCII码按位比较,不相同时,前面的大 返回 大的数,后面的大,返回负的少的个数

字符串比较(按照位数)-strncmp

#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);

// 前后字符串比较,比较前n位,比较方式同上

不区分大小写的字符串比较-strcasecmp

#include <strings.h>
int strcasecmp(const char *s1, const char *s2);

// 不区分大小写的比较,比较方式同上

不区分大小写的比较(前n位)-strncasecmp

#include <strings.h>
int strncasecmp(const char *s1, const char *s2, size_t n);

// 不区分大小写的比较,比较前n位,比较方式同上

字符串按照格式写入-sprintf

#include <stdio.h>
int sprintf(char *str, const char *format, ...);

// 按照 中间的格式,将后面的变量 写入到 前面的字符串中
char buf[128] = {0};
if(sprintf(buf,"%s: %d\n","name",18) > 0){
	//成功 返回 写入的字符数
}else{
	//失败返回 负数
}

字符串按照格式和个数写入-snprintf

#include <stdio.h>
int snprintf(char *str, size_t size, const char *format, ...);

// 按照中间格式,将后面的变量们,写入到第一个变量中,写入 size个
// 注意: size为最大限制个数,实际写入最大个数为 size - 1 个,最后一位会被 写入 '\0'
char buf[128] = {0};
if(snprintf(buf,32,"%s: %d\n","name",18) > 0){	//按照 %s: %d 格式将 name 跟 18 写入到 buf中,最多写入 32个
	//成功 返回 写入的字符数
}else{
	//失败返回 负数
}

字符串拼接-strcat

#include <string.h>
char *strcat(char *dest, const char *src);

// 将src字符串 拼接到 dest 字符串中,替换dest的'\0'。需要注意dest字符串足够大。

字符串拼接(前n位)-strncat

#include <string.h>
char *strncat(char *dest, const char *src, size_t n);

// 将src字符串中的前n位 拼接到 dest 字符串中,替换dest的'\0'。需要注意dest字符串足够大。

字符串切割-strtok

#include <string.h>
char *strtok(char *str, const char *delim);

// 字符串切割,将str 按照 delim 样式切割。将切割完的字符串的指针返回
// 第二次切割时,str 写为 NULL

int main(int argc, char const *argv[])
{
    char buf[128] = "this_is_test:name:qxy:age:200";
    char *temp = NULL;
    temp = strtok(buf,":");
    while(temp != NULL){
        printf("__<%s>\n",temp);
        temp = strtok(NULL,":");
    }
    return 0;
}

执行结果

字符串切割-strsep

#include <string.h>
char *strsep(char **stringp, const char *delim);

// 字符串切割:将stringp 字符串 按照 字符 delim 进行切割
// 切割完 前面的部分 通过返回值返回,剩余部分 保存在 stringp 字符串中

int main()
{
    char query[] ="this_is_test:name:qxy:age:200";
    char *q, *temp_q;
    q = query;

    printf("old_str is <%s>\n",query);

    temp_q = strsep(&q,":"); 
    printf("[temp_q ] :<%s>\n", temp_q); //但是
    printf("[q] :<%s>\n", q);

    temp_q = strsep(&q,":"); 
    printf("[2temp_q ] :<%s>\n", temp_q);
    printf("[2q] :<%s>\n", q);

    temp_q = strsep(&q,":");
    printf("[3temp_q ] :<%s>\n", temp_q);
    printf("[3q] :<%s>\n", q);

    return 0;
}

在这里插入图片描述

查找字符串是否在另一个字符串中-strstr

#include <string.h>
char *strstr(const char *haystack, const char *needle);

// 字符串查找,查找后面的字符串 是否在 前面的字符串中
// 没找到返回 NULL
// 找到,返回查找字符串的在haystack字符串的第一位指针

查找字符串是否在另一个字符串中-不区分大小写-strcasestr

#include <string.h>
char *strcasestr(const char *haystack, const char *needle);

// 查找后面字符串 是否在 前面字符串中,不区分大小的的查找
// 没找到返回 NULL
// 找到,返回查找字符串的在haystack字符串的第一位指针

查找某个字符是否在字符串中-strchr

#include <string.h>
char *strchr(const char *s, int c);

// 函数返回一个指针,指向前面字符串中 最后一次出现的字符c 的位置
// 没找到返回 NULL

字符串转数字-atoi

#include <stdlib.h>
int ret = atoi(const char* buf);

// 出错返回 0

在字符串提取前面的数字字符并转换成数字(根据参数选择转换后的数字类型)-strtoul

#include <stdlib.h>
int main(int argc, char const *argv[])
{
    char buf[128] = "         25036 HELLO_WORLD QXY";
    //char buf[128] = "        HELLO_WORLD QXY 2525252";    //这个不行.....
    printf("buf is <%s>\n",buf);
    char *temp = NULL;

    unsigned long int x = strtoul(buf,&temp,10);

    printf("x = <%lu>\n",x);
    printf("temp = <%s>\n",temp);
    printf("buf = <%s>\n",buf);
    return 0;
}

strtoul

unsigned long strtoul(const char nptr, char **endptr, int base);
strtoul()函数根据给定的基数将nptr中字符串的初始部分转换为无符号长值,该值必须为介于2和36之间(包括2和36)或者是特殊值0。
基本上就是 0 2 8 10 16 (如果是 0 字符串以0x开头就是16进制读取,以0开头 就是8进制,否则一律按十进制处理)
给定基数中的数字。(在10以上的base中,大写或小写字母“A”表示10,“B”表示11,依此类推 “Z”表示35。)
字符串可以以任意数量的空格 tab 开头,后跟一个可选的“+”或“-”号。
字符串的剩余部分以显而易见的方式转换为无符号长值,在第一个无效字符处停止
如果endptr不为NULL,strtoul()将第一个无效字符的地址存储在
endptr中。如果根本没有数字,strtoul()将存储endptr中nptr的原始值(并返回0)。特别是,如果返回时nptr不是“\0”,但**endptr是“\0”时,则整个字符串为有效的

strtoull()函数的工作原理与strtoul()函数类似,但返回一个无符号长-长值。

判断字符是否为空-isspace

’ ’ (0x20) space (SPC) 空格符
‘\t’ (0x09) horizontal tab (TAB) 水平制表符
‘\n’ (0x0a) newline (LF) 换行符
‘\v’ (0x0b) vertical tab (VT) 垂直制表符
‘\f’ (0x0c) feed (FF) 换页符
‘\r’ (0x0d) carriage return (CR) 回车符

#inlcude <ctype.h>
int ret = isspace(char c);

//为空返回非0,不为空返回 0

检查字符是否是十进制数字字符-isdigit

#inlcude <ctype.h>
int ret = isdigit(char c);

//是一个数字,则该函数返回非零值,否则返回 0。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用贝叶斯网络检测因果关系,提升模型效果更科学(附Python代码)

虽然机器学习技术可以实现良好的性能&#xff0c;但提取与目标变量的因果关系并不直观。换句话说&#xff0c;就是&#xff1a;哪些变量对目标变量有直接的因果影响&#xff1f; 机器学习的一个分支是贝叶斯概率图模型(Bayesian probabilistic graphical models)&#xff0c;也…

SpringCloud网关介绍

一、Gateway简介 1、官网 上一代zuul 1.X&#xff1a;https://github.com/Netflix/zuul/wiki 当前gateway&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 2、是什么 SpringCloud Gateway是SpringCloud的一个全…

2023 CCF中国软件大会(CCF ChinaSoft)“软件工程教育”论坛 成功召开

2023年12月1日&#xff0c;2023年度CCF中国软件大会“软件工程教育”论坛成功召开。 ✦ 自去年来大模型技术的出现以及在各个领域的应用&#xff0c;对相关的学科和行业产生了深刻的影响。软件工程首当其冲&#xff0c;以ChatGpt和CopilotX等为代表的智能化开发工具可以帮助软…

Spring Boot 3 集成 Druid 连接池详解

在现代的Java应用中&#xff0c;使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池&#xff0c;提供了丰富的监控和管理功能&#xff0c;成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源&#xff0c;集成Druid连接池&…

我对迁移学习的一点理解(系列2)

文章目录 我对迁移学习的一点理解 我对迁移学习的一点理解 源域和目标域是相对的概念&#xff0c;指的是在迁移学习任务中涉及到的两个不同的数据集或领域。 源域&#xff08;Source Domain&#xff09;通常指的是已经进行过训练和学习的数据集&#xff0c;它被用来提取特征、…

2023-12-09 LeetCode每日一题(下一个更大的数值平衡数)

2023-12-09每日一题 一、题目编号 2048. 下一个更大的数值平衡数二、题目链接 点击跳转到题目位置 三、题目描述 如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0…

Temu卖家如何获取流量?Temu新手卖家流量来源哪里?——站斧浏览器

流量对于每个平台来说都是很重要的&#xff0c;那么Temu卖家如何获取流量&#xff1f;流量来源哪里&#xff1f; Temu卖家如何获取流量&#xff1f; 1、优化产品标题和描述&#xff1a;在Temu平台上&#xff0c;买家通常通过搜索关键词来寻找他们感兴趣的产品。因此&#xff…

Axios 拦截器实战教程:简单易懂

Axios 提供了一种称为 “拦截器&#xff08;interceptors&#xff09;” 的功能&#xff0c;使我们能够在请求或响应被发送或处理之前对它们进行全局处理。拦截器为我们提供了一种简洁而强大的方式来转换请求和响应、进行错误处理、添加认证信息等操作。在本文中&#xff0c;我…

P10 Linux进程编程 fork创建子进程

目录 前言 01 fork()创建子进程 示例 1使用 fork()创建子进程。 02 fork创建新进程时发生了什么事&#xff1f; 2.1 父、子进程中对应的文件描述符指向了相同的文件表 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《Linux C应用编程&#xf…

[Linux] yum安装分布式LNMP架构

1. 在一台主机安装nginx&#xff08;192.168.136.120&#xff09; 1.1 搭建nginx相关的yum源 cd /yum.repos.d mkdir bak mv *.repo bak vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgche…

题解:CF1902A. Binary Imbalance

题解&#xff1a;CF1902A. Binary Imbalance 先给个题目链接。 题目翻译&#xff08;由“CodeForces Better&#xff01;”和“DeepL 翻译”提供&#xff09;&#xff1a; 我们知道&#xff0c;如果初始字符串中“0”的个数就大于“1”的个数&#xff0c;答案肯定是YES&…

【二分答案法】Leetcode相关题目解析

题目&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目分析&#xff1a; &#xff08;1&#xff09;据题知&#xff0c;索引-1、索引n&#xff08;n为数组长度&#xff09;处的元素都默认为无穷小&#xff0c;我们可以在一开始特判…

软件设计师——操作系统(一)

&#x1f4d1;前言 本文主要是【操作系统】——软件设计师——操作系统的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

鸿蒙开发组件之ForEach列表

一、ForEach函数 ForEach函数是一个迭代函数&#xff0c;需要传递两个必须参数和一个可选参数。主要通过迭代来获取参数arr中的数据不断的生成单个Item来生成鸿蒙中的列表样式 二、先创建单个的Item的UI 通过嵌套Row与Column来实现单个Item的UI。例如图中没有折扣的可以看成一…

Pandas中DataFrame对象的创建与常用属性方法(第2讲)

Pandas中DataFrame对象的创建与常用属性方法(第2讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

【Docker】swarm stack部署多service应用

前面我们已经学习过了Docker Compose&#xff0c;它可以用来进行一个完整的应用程序相互依赖的多个容器的编排的&#xff0c;但是缺点是只能在单机模式使用&#xff0c;不能在分布式多机器上使用&#xff1b;前面我们也学习了Docker swarm&#xff0c;它可以将单个服务部署为多…

鸿蒙生态开发就业前景到底好不好

鸿蒙生态开发是指基于华为自主研发的操作系统鸿蒙&#xff08;HarmonyOS&#xff09;进行应用程序开发和生态建设。目前&#xff0c;鸿蒙生态开发的前景非常好&#xff0c;原因如下&#xff1a;做鸿蒙应用开发到底学习些啥&#xff1f; (qq.com) 1&#xff1a;政府支持&#x…

万界星空科技mes系统中看板管理

我们很多企业现在都有大屏&#xff0c;那到底万界星空科技低代码云mes系统管理中看板管理有什么作用&#xff1f;我总结了几条: 1.提高车间的生产效率 2.有效的监控设备运行状况 3.控制生产线运行 4.增加和改善用户体验 5.提高工作效率和工作安全性

综述 2019-Genome Biology:非比对方法的benchmark

Zielezinski, Andrzej, et al. "Benchmarking of alignment-free sequence comparison methods." Genome biology 20.1 (2019): 1-18. Benchmarking of alignment-free sequence comparison methods | Genome Biology | Full Text 被引次数&#xff1a;170&#xff…

【算法通关村】链表反转经典问题解析

&#x1f6a9;本文已收录至算法学习之旅 一.基础反转 我们通常有两种方法反转链表&#xff0c;一种是直接操作链表实现反转操作&#xff0c;一种是建立虚拟头节点辅助实现反转操作。 力扣习题链接&#xff1a;206. 反转链表 (1) 直接操作实现反转 我们需要一个变量pre来保…