linux字符串处理
目录
- 1 C 截取字符串,截取两个子串中间的字符串
- 2 获取该字符串后面的字符串
- 用 strstr() 函数查找需要提取的特定字符串,然后通过指针运算获取该字符串后面的字符串
- 用 strtok() 函数分割字符串,找到需要提取的特定字符串后,调用 strtok() 传入 NULL 参数继续分割字符串获取下一个子串。
- 3 C语言strncpy
- 字符串的截取
- 从左边开始截取n个字符
- 从右边开始截取n个字符
- 从中间某处截取一定长度的的子字符串
- C语言中将文件中的某行的字符串读取出来
- 读取指定行
- 提取包含特定内容的所有行
- 读取包含指定内容的行数
- 获取所在行
- 清空字符串
1 C 截取字符串,截取两个子串中间的字符串
// 截取字符串,截取两个子串中间的字符串
char g_str[400];
char* InterceptString (char *str, char *left_str, char *right_str)
{char *l_str = strstr(str, left_str);int r_str = strcspn(l_str, right_str);int l_len = strlen(left_str);int str_len = r_str - l_len;strncpy(g_str, l_str+l_len, str_len);g_str[str_len+1] = '\0';return g_str;
}// 截取字符串的信号强度char at[] = "AT+CSQ\r\n\r\n+CSQ: 18,99\r\n\r\nOK\r\n";char *dd;dd = InterceptString (at, "+CSQ: ",",99");USART_printf(&huart1,"dd=%s\r\n",dd);//将串口2接收到的数据发送到串口1memset(g_str, 0, sizeof(g_str)); // 清空字符串
2 获取该字符串后面的字符串
用 strstr() 函数查找需要提取的特定字符串,然后通过指针运算获取该字符串后面的字符串
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "The quick brown fox jumps over the lazy dog";
char *substr = strstr(str, "brown"); // 查找 "brown" 子串
if (substr != NULL)
{
substr += strlen("brown"); // 获取 "brown" 后面的字符串 printf("%s", substr);
}
return 0;
}
#include <stdio.h>
#include <string.h>char *get_str_spec(char *search_string, char *sing)
{char *substr = strstr(search_string, sing); // 查找 "search_string" 子串 if (substr != NULL) { substr += strlen(sing); // 获取 "brown" 后面的字符串 printf("%s", substr); }return substr;
}int main() {
char str[] = "The quick brown fox jumps over the lazy dog";
char *cCC=NULL;cCC=get_str_spec(str, "brown ");
printf("%s\n",cCC);
}
输出结果为:
fox jumps over the lazy dog
用 strtok() 函数分割字符串,找到需要提取的特定字符串后,调用 strtok() 传入 NULL 参数继续分割字符串获取下一个子串。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "The quick brown fox jumps over the lazy dog";
char *token = strtok(str, " "); // 分割字符串,以空格为分隔符
while (token != NULL) {
if (strcmp(token, "brown") == 0)
{ // 找到需要提取的特定字符串
token = strtok(NULL, " "); // 继续分割字符串获取下一个子串 printf("%s", token); break; }
token = strtok(NULL, " "); } return 0;
}
输出结果为:
fox
3 C语言strncpy
字符串的截取
#include <stdio.h>
#include <string.h>int main(void){char dest[5]={0};char src[]="abcdefghijk";strncpy(dest,src,4);//注意一下这里假如改为5的话,可能会出现//内存越界使得dest可能会占用其它模块的内存,从而导致错误发生;//strncpy(dest,src+5,4);//从第5个字符开始截取;printf("dest: %s\n",dest);
return 0;
}
从左边开始截取n个字符
static char* left(char *dest,const char *src ,int n){
char *p=dest;
char *q=src;
int len=strlen(src);if(n>len){n=len;
}
while(n--) *(p++)=*(q++);
*(p++)='\0';return dest;
}
从右边开始截取n个字符
static char* light(char *dest,const char *src ,int n){
char *p=dest;
char *q=src;
int len=strlen(src);if(n>len){n=len;
}
//int start=len-n;
//q=q+start;
q+=len-n;
while(n--) *(p++)=*(q++);
*(p++)='\0';
return dest;
}
从中间某处截取一定长度的的子字符串
static char* cut_substr(char *dest,const char *src ,char start,int n){
char *p=dest;
char *q=src;
chsr *temp=NULL;
int len=strlen(src);if(start>=len || start<0){return NULL;
}
temp=q+start;
if(n>strlen(temp)){//注意这里,截取长度如果超过了src剩余的长度则只截取到src的最后,以避免内存越界;n=strlen(temp);
}
q+=start;
while(n--) *(p++)=*(q++);
*(p++)='\0';
return dest;
}
C语言中将文件中的某行的字符串读取出来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxCols 2000 //设定每行字符数不超过MaxCols,根据变化调整
//获取已经打开文件fp的第line行内容到stri,如果成功返回得到的字节数,
//如果没有那么多行,返回-2
int getlinetxt(FILE *fp,int line,char *stri){int i;fseek(fp,0,0); //指针到文件最开始for(i=0;i<line;i++) if(fgets(stri,MaxCols,fp)==NULL) //没有这么多行错误return -2;return strlen(stri);
}
//获取filename文件的第line行内容到stri,如果成功返回得到的字节数,
//如果打开文件失败,返回-1,如果没有那么多行,返回-2
int getfiletxt(char *filename,int line,char *stri){FILE *fp;if ((fp=fopen(filename,"r"))==NULL){//打开文件错误,返回-1 return -1;}return getlinetxt(fp,line,stri);fclose(fp);
}
int main(){char s[MaxCols];int row=10, flag;//以下例子是获取d:\temp.txt的第10行文本内容 flag=getfiletxt("d:\\temp.txt",row,s);if (flag==-1)printf("打开文件错误\n");else if(flag==-2)printf("文件中的行数不足%d行\n",row);elseprintf("获取到的文本是: \n%s包含最后的换行符,长度=%d\n",s,flag);
}
读取指定行
feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
#include <stdio.h>
#include "readline.h"
// 读取文件指定一行
int ReadLine1(const char *fileName, char outBuf[], int n){int whichLine = n; //指定要读取哪一行int currentIndex = 1; //当前读取的行char buf[1024] = { 0 }; //临时 不能做返回值 防止局部数组被释放后非法访问内存FILE *file;int isOpen = fopen_s(&file, fileName, "r");if (isOpen != 0) {printf("文件打开失败\n");return -1;}while (!feof(file)){if (currentIndex == whichLine){fgets(outBuf, 1024, file); //读取一行 必须用数组break;}fgets(buf, 1024, file); //临时数组读取一行,并定位到下一行currentIndex++;}fclose(file);return 0;
}
提取包含特定内容的所有行
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int find(char *str,char ch)
{int i;for(i=0;i<strlen(str);i++){if(str[i]==ch){return 1;}}return 0;
}
void change(char *str,char ch1,char ch2)
{int i;for(i=0;i<strlen(str);i++){if(str[i]==ch1){str[i]=ch2;}}
}
void deletestr(char*str,char ch)
{int i;for(i=0;i<strlen(str);i++){if(str[i]==ch){str[i]='\0';}}
}
int main()
{ifstream input("1.dat");ofstream output("2.dat");char str[50];do{input>>str;if(find(str,'A')){change(str,'A','B');deletestr(str,'C');if(str!=NULL){output<<str<<endl;}}}while(!input.eof());input.close();output.close();return 0;
}


读取包含指定内容的行数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{ char *filename = "./example.txt"; // 替换为您的文件名 char *search_string = "target_string"; // 替换为您要搜索的字符串 int count = 0; FILE *file = fopen(filename, "r"); if (file == NULL) { perror("Error opening file"); return 1; } char line[256]; while(fgets(line, sizeof(line), file)!= NULL) { if (strstr(line, search_string)!= NULL){ count++; } } fclose(file); printf("Number of lines containing the target string %d \n", count); return 0;
}
获取所在行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/*
char *filename :path
char *search_string: string
*/
int get_linenum(char *filename, char *search_string)
{//char *filename = "./example.txt"; // 替换为您的文件名 //char *search_string = "target_string"; // 替换为您要搜索的字符串 char line[1024];int num=0; int count = 0;FILE *file = fopen(filename, "r");if (file == NULL){perror("Error opening file");return 1;}while (fgets(line, sizeof(line), file)!= NULL){num++;if (strstr(line, search_string)!= NULL){count++;break;}}fclose(file);//printf("Number of lines containing the target string %d line num: %d \n", count,num);return num;
}int main()
{printf("%d\n", get_linenum("./example.txt", "target_string"));
}
清空字符串
char a[ ]="aaaaaaaa"; //定义字符数组
for (unsigned int i = 0; i < strlen(a); i++)a[i] = '\0' ; //for循环清空数组
memset包含在头文件string.h中,函数原型为:memset(void *s,int ch,size_t n)。
char a[ ]="aaaaaaaa"; //定义字符数组
memset(a, 0, sizeof(a)); //清空数组
直接使用strcpy将一个空串赋值给字符串就可以,需要string.h
char ss[11] = {"hello world"}; //当前为hello world
strcpy(ss, "");
//现在的ss就是空串了
相关文章:
linux字符串处理
目录 1 C 截取字符串,截取两个子串中间的字符串2 获取该字符串后面的字符串用 strstr() 函数查找需要提取的特定字符串,然后通过指针运算获取该字符串后面的字符串用 strtok() 函数分割字符串,找到需要提取的特定字符串后,调用 strtok() 传入…...
Nginx入门——Nginx的docker版本和windows版本安装和使用 代理的概念 负载分配策略
目录 引出nginx是啥正向代理和反向代理正向代理反向代理 nginx的安装使用Docker版本的nginx安装下载创建挂载文件获取配置文件创建docker容器拷贝容器中的配置文件删除容器 创建运行容器开放端口进行代理和测试 Windows版本的使用反向代理多个端口运行日志查看启动关闭重启 负载…...
Zebec Protocol:模块化 L3 链 Nautilus Chain,深度拓展流支付体系
过去三十年间,全球金融科技领域已经成熟并迅速增长,主要归功于不同的数字支付媒介的出现。然而,由于交易延迟、高额转账费用等问题愈发突出,更高效、更安全、更易访问的支付系统成为新的刚需。 此前,咨询巨头麦肯锡的一…...
Oracle-rolling upgrade升级19c
前言: 本文主要描述Oracle11g升19c rolling upgrade升级测试,通过逻辑DGautoupgrade方式实现rolling upgrade,从而达到在较少停机时间内完成Oracle11g升级到19c的目标 升级介绍: 升级技术: rolling upgrade轮询升级,通过采用跨版…...
Spring IOC详解
Spring 笔记 官网:https://spring.io/ 核心功能:当你的项目启动的时候,自动的将当前项目的各种 Bean 都自动的注册到 Spring 容器中,然后在项目的其他地方,如果需要用到这些 Bean,直接去 Spring 容器中查…...
Unity——DOTween插件使用方法简介
缓动动画既是一种编程技术,也是一种动画的设计思路。从设计角度来看,可以有以下描述 事先设计很多基本的动画样式,如移动、缩放、旋转、变色和弹跳等。但这些动画都以抽象方式表示,一般封装为程序函数动画的参数可以在使用时指定&…...
数据库——Redis 单线程模型详解
文章目录 Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file …...
leetcode 567. 字符串的排列(滑动窗口-java)
滑动窗口 字符串的排列滑动窗口代码演示进阶优化版 上期经典 字符串的排列 难度 -中等 leetcode567. 字符串的排列 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 换句…...
Git —— 分支重命名操作
在开发中,对某个分支进行重命名的操作: 1、本地分支重命名 本地分支是指:你当前这个分支还没有推送到远程的情况,这种情况修改分支名称就要方便很多 git branch -m 原始名称 新名称 //示例: 修改 test 为 newTest g…...
JavaIO流
JavaIO流 一、概念二、File类三、File类的使用1、File文件/文件夹类的创建2、File类的获取操作3、File类判断操作 - boolean4、File类对文件/文件夹的增删改5、File类的获取子文件夹以及子文件的方法 四、Java中IO流多种维度的维度1、按照流向 - Java程序2、按照流的大小分类3、…...
FlinkSql 如何实现数据去重?
摘要 很多时候flink消费上游kafka的数据是有重复的,因此有时候我们想数据在落盘之前进行去重,这在实际开发中具有广泛的应用场景,此处不说详细代码,只粘贴相应的flinksql 代码 --********************************************…...
机器学习概念
目录 一、人工智能、机器学习、深度学习的关系 二、什么是深度学习? 2.1 深度学习常用算法 一、人工智能、机器学习、深度学习的关系 人工智能、机器学习和深度学习的关系如下所示。 二、什么是深度学习? 深度学习( DL, Deep Learning) 是机器学习 …...
【数据结构】排序(插入、选择、交换、归并) -- 详解
一、排序的概念及其运用 1、排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记…...
游戏中的图片打包流程,免费的png打包plist工具,一款把若干资源图片拼接为一张大图的免费工具
手机游戏开发中,为了提高图片渲染性能,经常需要将小图片合并成一张大图进行渲染。如果手工来做的话就非常耗时。TexturePacker就是一款非常不错方便的处理工具。TexturePacker虽然非常优秀,但不是免费的。 对于打包流程,做游戏的…...
Springboot实现ENC加密
Springboot实现ENC加密 1、导入依赖2、配置加密秘钥(盐)3、获取并配置密文4、重启项目测试5、自定义前缀、后缀6、自定义加密方式 1、导入依赖 关于版本,需要根据spring-boot版本,自行修改 <dependency><groupId>co…...
nginx 托管vue项目配置
server {listen 80;server_name your_domain.com;location / {root /path/to/your/vue/project;index index.html;try_files $uri $uri/ /index.html;} }奇怪的现象,在vue路由中/会跳转到/abc/def,但如果直接输入/abc/def会显示404,添加 try_files $uri…...
Vue3中如何进行封装?—组件之间的传值
用了很久一段时间Vue3Ts了,工作中对一些常用的组件也进行了一些封装,这里对封装的一些方法进行一些简单的总结。 1.props传递 首先在主组件进行定义传值 <template><div>这里是主组件<common :first"first"></common&…...
实训笔记8.25
实训笔记8.25 8.25笔记一、Flume数据采集技术1.1 Flume实现数据采集主要借助Flume的组成架构1.2 Flume采集数据的时候,核心是编写Flume的采集脚本xxx.conf1.2.1 脚本文件主要由五部分组成 二、Flume案例实操2.1 采集一个网络端口的数据到控制台2.1.1 分析案例的组件…...
vue自定义监听元素宽高指令
在 main.js 中添加 // 自定义监听元素高度变化指令 const resizerMap new WeakMap() const resizeObserver new ResizeObserver((entries) > {for (const entry of entries) {const handle resizerMap.get(entry.target)if (handle) {handle({width: entry.borderBoxSiz…...
网络爬虫到底是个啥?
网络爬虫到底是个啥? 当涉及到网络爬虫技术时,需要考虑多个方面,从网页获取到最终的数据处理和分析,每个阶段都有不同的算法和策略。以下是这些方面的详细解释: 网页获取(Web Crawling)&#x…...
别再手动画图了!WPS PPT里这个‘转智能图形’功能,3秒让文字变高级图示
WPS PPT智能图形进阶指南:3秒实现专业级视觉表达 在快节奏的职场环境中,演示文档的视觉呈现往往决定着信息传递的效率。传统PPT制作中,将文字列表转换为可视化图形需要经历形状绘制、文字排版、配色调整等多道工序,耗时且难以保证…...
大模型是否即将到达算法极限
大模型是否即将到达算法极限:深入总结 一、核心结论 目前的大模型确实已经非常强大,但更准确的判断不是:大模型算法潜力即将到达极限。而是:纯 Transformer 纯互联网语料 纯预训练 scaling 这条旧路线,正在接近阶段性…...
手把手教你配置HC32F460的Timer0 Unit2 B通道,精准实现400us串口接收超时
HC32F460定时器精准配置实战:400us串口接收超时中断与DMA协同设计 在嵌入式系统中,串口通信的可靠性往往取决于对数据包边界的准确判断。当面对无固定帧头尾的连续数据流时,如何精确捕捉数据包间隔成为开发难点。HC32F460系列MCU提供的接收超…...
告别盲测!用Arduino UNO和VL6180X做个桌面防撞小助手(OLED实时显示距离)
用Arduino UNO和VL6180X打造智能桌面防撞系统 每次在办公桌上不小心碰倒水杯或手机从桌边滑落时,那种手忙脚乱的场景想必大家都不陌生。今天我们就来解决这个日常小烦恼——利用Arduino UNO开发板和VL6180X传感器,配合OLED显示屏,制作一个能实…...
VMPDump终极指南:如何轻松破解VMProtect 3.X x64代码保护
VMPDump终极指南:如何轻松破解VMProtect 3.X x64代码保护 【免费下载链接】vmpdump A dynamic VMP dumper and import fixer, powered by VTIL. 项目地址: https://gitcode.com/gh_mirrors/vm/vmpdump 你是否曾面对被VMProtect保护的软件感到束手无策&#x…...
从单摆到机械臂:拉格朗日方程在机器人控制中的三个实战应用(附MATLAB/Simulink模型)
从单摆到机械臂:拉格朗日方程在机器人控制中的三个实战应用(附MATLAB/Simulink模型) 在机器人控制领域,动力学建模是连接理论设计与实际应用的关键桥梁。拉格朗日方程作为一种基于能量的分析方法,能够优雅地处理复杂系…...
WanAndroid收藏系统设计:从UI交互到数据持久化的完整方案
WanAndroid收藏系统设计:从UI交互到数据持久化的完整方案 【免费下载链接】WanAndroid 🔥项目采用 Kotlin 语言,基于 MVP RxJava Retrofit Glide EventBus 等架构设计,努力打造一款优秀的 [玩Android] 客户端 项目地址: htt…...
如何高效配置跨架构模拟器:Box64专业用户的终极实践指南
如何高效配置跨架构模拟器:Box64专业用户的终极实践指南 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 Box64是…...
从“佩戴感知”到“无感融入”:UWB vs 镜像视界——空间智能的代际跃迁
从“佩戴感知”到“无感融入”:UWB vs 镜像视界——空间智能的代际跃迁空间智能产业正迎来划时代理念革新,行业认知正式完成从主动佩戴式感知向全域无感化融入的核心转变。以UWB为代表的传统定位技术,始终停留在依托外接设备实现信息采集的初…...
ARM BRBE技术:硬件级控制流分析与优化
1. ARM分支记录缓冲区扩展(BRBE)技术概述在现代处理器架构中,控制流信息的捕获对于性能分析和代码优化至关重要。ARM分支记录缓冲区扩展(Branch Record Buffer Extension, BRBE)是ARMv8/v9架构中引入的一项硬件特性,它通过专用硬件机制记录程序执行过程中…...
