嵌入式Linux,字符串的处理,以及相关函数详解

C 语言库函数中已经给我们提供了丰富的字符串处理相关函数,基本常见的字符串处理需求都可
以直接使用这些库函数来实现。

1. 字符串输入/输出

在程序当中,经常需要在程序运行过程中打印出一些信息,譬如调试信息、报错信息、中间产生的变量的值等等,以实现对程序运行状态的掌控和分析。

1.1 字符串输出

常用的字符串输出函数有 putchar() puts() fputc() fputs() ,前面我们经常使用 printf() 函数来输出字符串信息,而并没有使用到 putchar() puts() fputc() fputs() 这些函数,原因在于 printf() 可以按照自己规定的格式输出字符串信息,一般称为格式化输出;而 putchar() puts() fputc() fputs() 这些函数只能输出字符串,不能进行格式转换。
printf()一样,putchar()puts()fputc()fputs()这些函数也是标准 I/O 函数,属于标准 C 库函数。

 puts 函数

puts() 函数用来向标准输出设备(屏幕、显示器)输出字符串并自行换行。把字符串输出到标准输出设备,将' \0 ' 转换为换行符 ' \n ' puts 函数原型如下:
#include <stdio.h>
int puts(const char *s);
函数参数和返回值解释如下:
s 需要进行输出的字符串。
返回值: 成功返回一个非负数;失败将返回 EOF EOF 其实就是 -1

putchar 函数

putchar() 函数可以把参数 c 指定的字符(一个无符号字符)输出到标准输出设备,其输出可以是一个字符,可以是介于 0~127 之间的一个十进制整型数(包含 0 127 ,输出其对应的 ASCII 码字符),也可以是用 char 类型定义好的一个字符型变量。 putchar 函数原型如下:
#include <stdio.h>
int putchar(int c);
函数参数和返回值解释如下:
c 需要进行输出的字符。
返回值: 出错将返回 EOF

fputc 函数

fputc() putchar() 类似,也用于输出参数 c 指定的字符(一个无符号字符),与 putchar() 区别在于, putchar()只能输出到标准输出设备,而 fputc() 可把字符输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。fputc 函数原型如下:
#include <stdio.h>
int fputc(int c, FILE *stream);
函数参数和返回值解释如下:
c 需要进行输出的字符。
stream 文件指针。
返回值: 成功时返回输出的字符;出错将返回 EOF

fputs 函数

fputs() puts() 类似,也用于输出一条字符串,与 puts() 区别在于, puts() 只能输出到标准输出设
备,而 fputs() 可把字符串输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。函数原型如下:
#include <stdio.h>
int fputs(const char *s, FILE *stream);
函数参数和返回值解释如下:
s 需要输出的字符串。
stream 文件指针。
返回值: 成功返回非负数;失败将返回 EOF

1.2 字符串输入

常用的字符串输入函数有 gets() getchar() fgetc() fgets() 。与 printf() 对应,在 C 库函数中同样也提供了格式化输入函数 scanf()。与 scanf() 一样, gets() getchar() fgetc() fgets() 这些函数也是标准 I/O 函数,属于标准 C 库函数。

gets 函数

gets() 函数用于从标准输入设备(譬如键盘)中获取用户输入的字符串, gets() 函数原型如下:
#include <stdio.h>
char *gets(char *s);
函数参数和返回值解释如下:
s 指向字符数组的指针,用于存储字符串。
返回值: 如果成功,该函数返回指向 s 的指针;如果发生错误或者到达末尾时还未读取任何字符,则返回 NULL
用户从键盘输入的字符串数据首先会存放在一个输入缓冲区中, gets() 函数会从输入缓冲区中读取字符串存储到字符指针变量 s 所指向的内存空间,当从输入缓冲区中读走字符后,相应的字符便不存在于缓冲区了。
输入的字符串中就算是有空格也可以直接输入,字符串输入完成之后按回车即可, gets() 函数不检查缓冲区溢出。

getchar 函数

getchar() 函数用于从标准输入设备中读取一个字符(一个无符号字符),函数原型如下:
#include <stdio.h>
int getchar(void);
函数参数和返回值解释如下:
无需传参
返回值: 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
同样 getchar() 函数也是从输入缓冲区读取字符数据,但只读取一个字符,包括空格、 TAB 制表符、换行回车符等。

fgets 函数

fgets() gets() 一样用于获取输入的字符串, fgets() 函数原型如下:
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
函数参数和返回值解释如下:
s 指向字符数组的指针,用于存储字符串。
size 这是要读取的最大字符数。
stream 文件指针。

fgetc 函数

fgetc() getchar() 一样,用于读取一个输入字符,函数原型如下:
#include <stdio.h>
int fgetc(FILE *stream);
函数参数和返回值解释如下:
stream 文件指针。
返回值: 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
fgetc() getchar() 的区别在于, fgetc 可以指定输入字符的文件,既可以从标准输入设备输入字符,也可以从一个普通文件中输入字符,其它方面与 getchar 函数相同。

2.字符串长度

C 语言函数库中提供了一个用于计算字符串长度的函数 strlen() ,其函数原型如下:
#include <string.h>
size_t strlen(const char *s);
函数参数和返回值含义如下:
s 需要进行长度计算的字符串,字符串必须包含结束字符 ' \0 '
返回值: 返回字符串长度(以字节为单位),字符串结束字符 ' \0 ' 不计算在内。

3. 字符串拼接

C 语言函数库中提供了 strcat()函数或 strncat() 函数用于将两个字符串连接(拼接)起来 strcat 函数原型如下:
#include <string.h>
char *strcat(char *dest, const char *src);
函数参数和返回值含义如下:
dest 目标字符串。
src 源字符串。
返回值: 返回指向目标字符串 dest 的指针。
strcat() 函数会把 src 所指向的字符串追加到 dest 所指向的字符串末尾,所以必须要保证 dest 有足够的存储空间来容纳两个字符串,否则会导致溢出错误;dest 末尾的 ' \0 ' 结束字符会被覆盖, src 末尾的结束字符 '\0'会一起被复制过去,最终的字符串只有一个 ' \0 '

strncat 函数

strncat() strcat() 的区别在于, strncat 可以指定源字符串追加到目标字符串的字符数量, strncat 函数原型如下:
#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
函数参数和返回值含义如下:
dest 目标字符串。
src 源字符串。
n 要追加的最大字符数。
返回值: 返回指向目标字符串 dest 的指针。
如果源字符串 src 包含 n 个或更多个字符,则 strncat() n+1 个字节追加到 dest 目标字符串( src 中的 n个字符加上结束字符' \0 ' )。

4. 字符串拷贝

C 语言函数库中提供了 strcpy()函数和 strncpy()函数用于实现字符串拷贝strcpy 函数原型如下:

#include <string.h>
char *strcpy(char *dest, const char *src);
函数参数和返回值含义如下:
dest 目标字符串。
src 源字符串。
返回值: 返回指向目标字符串 dest 的指针。
strcpy() 会把 src (必须包含结束字符 ' \0 ' )指向的字符串复制(包括字符串结束字符 ' \0 ' )到 dest ,所以必须保证 dest 指向的内存空间足够大,能够容纳下 src 字符串,否则会导致溢出错误。

strncpy 函数

strncpy() strcpy() 的区别在于, strncpy() 可以指定从源字符串 src 复制到目标字符串 dest 的字符数量,strncpy 函数原型如下:
#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
函数参数和返回值解释如下:
dest 目标字符串。
src 源字符串。
n src 中复制的最大字符数。
返回值: 返回指向目标字符串 dest 的指针。
src 所指向的字符串复制到 dest ,最多复制 n 个字符。当 n 小于或等于 src 字符串长度(不包括结束字符的长度)时,则复制过去的字符串中没有包含结束字符' \0 ' ;当 n 大于 src 字符串长度时,则会将 src 字符串的结束字符' \0 '也一并拷贝过去,必须保证 dest 指向的内存空间足够大,能够容纳下拷贝过来的字符串,否则会导致溢出错误。

5. 内存填充

在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0

memset 函数

memset() 函数用于将某一块内存的数据全部设置为指定的值,其函数原型如下:
#include <string.h>
void *memset(void *s, int c, size_t n);
函数参数和返回值解释如下:
s 需要进行数据填充的内存空间起始地址。
c 要被设置的值,该值以 int 类型传递。
n 填充的字节数。
返回值: 返回指向内存空间 s 的指针。
参数 c 虽然是以 int 类型传递,但 memset() 函数在填充内存块时是使用该值的无符号字符形式,也就是函数内部会将该值转换为 unsigned char 类型的数据,以字节为单位进行数据填充。

bzero 函数

bzero() 函数用于将一段内存空间中的数据全部设置为 0 ,函数原型如下:
#include <strings.h>
void bzero(void *s, size_t n);
函数参数和返回值解释如下:
s 内存空间的起始地址。
n 填充的字节数。
返回值: 无返回值。

6. 字符串比较

C 语言函数库提供了用于字符串比较的函数 strcmp()strncmp()strcmp()函数原型如下:

#include <string.h>
int strcmp(const char *s1, const char *s2);
函数参数和返回值解释如下:
s1 进行比较的字符串 1
s2 进行比较的字符串 2
返回值:
       如果返回值小于 0 ,则表示 str1 小于 str2
      如果返回值大于 0 ,则表示 str1 大于 str2         
      如果返回值等于 0,则表示字符串 str1 等于字符串 str2
strcmp 进行字符串比较,主要是通过比较字符串中的字符对应的 ASCII 码值, strcmp 会根据 ASCII 编码依次比较 str1 str2 的每一个字符直到出现了不同的字符或者某一字符串已经到达末尾(遇见了字符串结束字符' \0 ' )。

strncmp 函数

strncmp() strcmp() 函数一样,也用于对字符串进行比较操作,但最多比较前 n 个字符 strncmp() 函数原型如下:
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
函数参数和返回值解释如下:
s1 参与比较的第一个字符串。
s2 参与比较的第二个字符串。
n 最多比较前 n 个字符。
返回值: 返回值含义与 strcmp() 函数相同。

7. 字符串查找

C 语言函数库中也提供了一些用于字符串查找的函数,包括 strchr()、strrchr()、strstr()、strpbrk()index()以及 rindex()等。

strchr 函数

使用 strchr() 函数可以查找到给定字符串当中的某一个字符,函数原型如下:
#include <string.h>
char *strchr(const char *s, int c);
函数参数和返回值含义如下:
s 给定的目标字符串。
c 需要查找的字符。
返回值: 返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c ,则返回 NULL
字符串结束字符 ' \0 ' 也将作为字符串的一部分,因此,如果将参数 c 指定为 ' \0 ' ,则函数将返回指向结束字符的指针。strchr 函数在字符串 s 中从前到后(或者称为从左到右)查找字符 c ,找到字符 c 第一次出现的位置就返回,返回值指向这个位置,如果找不到字符 c 就返回 NULL

strrchr 函数

strrchr() strchr() 函数一样,它同样表示在字符串中查找某一个字符,返回字符第一次在字符串中出现的位置,如果没找到该字符,则返回值 NULL ,但两者唯一不同的是, strrchr() 函数在字符串中是从后到前(或者称为从右向左)查找字符,找到字符第一次出现的位置就返回,返回值指向这个位置,strrchr() 函数原型如下:
#include <string.h>
char *strrchr(const char *s, int c);
函数参数和返回值含义与 strchr() 函数相同。

strstr 函数

strchr() 函数不同的是, strstr() 可在给定的字符串 haystack 中查找第一次出现子字符串 needle 的位置,不包含结束字符' \0 ' ,函数原型如下:
#include <string.h>
char *strstr(const char *haystack, const char *needle);
函数参数和返回值含义如下:
haystack 目标字符串。
needle 需要查找的子字符串。
返回值: 如果目标字符串 haystack 中包含了子字符串 needle ,则返回该字符串首次出现的位置;如果未能找到子字符串 needle ,则返回 NULL
上面的都是比较常见的,其他大家感兴趣可以单独再去查阅。
不断学习中,共勉!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

400G智算网络助力知名自动驾驶企业算力训练提效

根据Gartner的最新趋势预测&#xff0c;自动驾驶技术正迅速发展&#xff0c;预计在未来几年内将带来显著的商业效益&#xff0c;特别是在决策智能和边缘人工智能领域。目前&#xff0c;一家领军企业正积极拥抱基于大模型的数字化转型之路&#xff0c;作为自动驾驶领域的佼佼者&…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 ___autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变&#xff0c;ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…

数学活动是什么过程?

有专家说&#xff1a;数学活动是建构的操作过程&#xff0c;建构的过程必须是探索、发现和创造的过程。 什么是建构&#xff0c;建构就是构建&#xff0c;就是建立。明明有让人一看就明白的词&#xff0c;人非得弄得云遮雾绕。 也难怪&#xff0c;现在什么都流行上云。 上云…

windows11安装Linux子系统配置大数据hadoop

zai 1、安装linux子系统 1、启用适用于 Linux 的 Windows 子系统 搜索框里面输入<开发>即可跳转&#xff0c;打开开发人员模式 命令行里面输入systeminfo确定是否电脑已经支持虚拟化&#xff0c;是则可以继续安装: 2、然后先启用“适用于 Linux 的 Windows 子系统”可选…

RPC设计--从reactor设计 (IOthread)

主从reactor架构 一般的一个网络IO库都是主从reactor模式&#xff0c;即主线程中有一个MainReactor&#xff0c;其负责监听ListenFd&#xff0c;当接受到新的用户连接时&#xff0c;返回的clientfd并不会加入的MainReacotr&#xff0c;而是在子线程&#xff08;这里称为IO线程&…

微信创建小程序码 - 数量不受限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…

【机器学习】基于SVM、逻辑回归和CNN的手写数字识别:性能对比与应用分析

基于SVM、逻辑回归和CNN的手写数字识别&#xff1a;性能对比与应用分析 1 基于SVM对手写数字识别2 基于逻辑回归对手写数字进行识别3 基于CNN对手写数字进行识别总结对比分析 1 基于SVM对手写数字识别 在使用SVM方法对手写数字进行识别的时候&#xff0c;我采用了一对多&#…

群控系统服务端开发模式-应用开发-邮件工厂电信189发送开发

一、电信189邮件工厂开发 1、添加框架对应的SDK composer require phpmailer/phpmailer 2、添加电信189邮件工厂 在根目录下extend文件夹下Mail文件夹下channel文件夹下&#xff0c;创建电信189邮件发送工厂并命名为DianxinMailSender。记住&#xff0c;一定要在电信189邮件发…

部署loki,grafana 以及springcloud用法举例

文章目录 场景docker 部署grafanadocker-compose部署loki维护配置文件 local-config.yaml维护docker-compose.yml配置启动 grafana 添加loki数据源springcloud用法举例查看loki的explore,查看日志 场景 小公司缺少运维岗位&#xff0c;需要研发自己部署日志系统&#xff0c;elk…

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 4

三十三、出入库管理 Header.vue导一下,RecordController加一个 //将入库数据和原有数据相加吧//新增PostMapping("/save")public Result save(RequestBody Record record) {return recordService.save(record) ? Result.success() : Result.fail();} GoodsManage.v…

Leetcode—1133. 最大唯一数【简单】Plus

2024每日刷题&#xff08;205&#xff09; Leetcode—1133. 最大唯一数 C 实现代码 class Solution { public:int largestUniqueNumber(vector<int>& nums) {constexpr int MAX 1000;vector<int> count(MAX 1, 0);for(int num: nums) {count[num];}for(int…

如何通过自学成长为一名后端开发工程师?

大家好&#xff0c;我是袁庭新。最近&#xff0c;有星友向我提出了一个很好的问题&#xff1a;如何通过自学成为一名后端开发工程师&#xff1f; 为了解答这个疑问&#xff0c;我特意制作了一个视频来详细分享我的看法和建议。 戳链接&#xff1a;如何通过自学成长为一名后端开…

GCC/G++ Centos离线安装

方式一&#xff08;推荐&#xff09; 官方地址&#xff1a;https://gcc.gnu.org/releases.html 镜像站点1&#xff1a;http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/ 镜像站点2&#xff1a;https://vault.centos.org/7.5.1804/os/x86_64/Packages/ gcc &#xff1a…

工业—使用Flink处理Kafka中的数据_ChangeRecord2

使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,每隔 1 分钟输出最近 3 分钟的预警次数最多的 设备,将结果存入Redis 中, key 值为

【GoLang】文件操作中perm参数的用法

我们在创建文件时&#xff0c; perm 参数主要用于设置新创建文件的权限&#xff0c;有时是0755&#xff0c;有时是0644。那你知道这些数字都代表什么意思吗&#xff1f; 让我们一个个数字拆开了说&#xff0c;现在从左到右给每个数字一个编号 编号1&#xff1a;通常是0&…

【Selenium】基于 WebDriverWait 爬取带有懒加载的静态页面

0x00 前言 朋友做标书&#xff0c;需要用到每日温度&#xff0c;他的老板让在这个网页手动复制做一个长期表出来&#xff1a;http://www.tianqihoubao.com/lishi/nanjing/month/202412.html 想着帮个忙&#xff0c;做个爬虫脚本吧&#xff0c;忽然发现这个页面很有意思&#xf…

fpga vga

因为 如果是减1的话是会少减1的 因为piel_x会延迟 timescale 1ns / 1psmodule vga(//系统侧input wire clk_sys ,input wire rst_n ,input wire clk ,//在顶层例化的pll产生的input wire locked ,/…

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…

如何做好一份技术文档?-中小企实战运营和营销工作室博客

做好一份技术文档需要考虑文档的目的、受众、内容结构、表达清晰度等多个方面&#xff0c;以下是详细步骤&#xff1a; 一、明确文档目的和受众 确定目的 技术文档的目的可能多种多样&#xff0c;例如记录软件系统的功能和操作流程&#xff0c;便于用户使用&#xff1b;或是作为…

【Java语言】内部类

可以将一个类的定义在另一个类或者一个方法内部&#xff08;一般都是定义在类里面&#xff09;&#xff0c;在内部的类就称为内部类&#xff0c;在内部类的外部的类称为外部类。内部类可以在数据结构实现链表的结点等还有很多的地方使用它。然而内部类又分四种&#xff1a;静态…