linux字符串处理

目录

  • 1. C 截取字符串,截取两个子串中间的字符串
    • linux
    • 串口AT指令
  • 2. 获取该字符串后面的字符串
    • 用 strstr() 函数查找需要提取的特定字符串,然后通过指针运算获取该字符串后面的字符串
    • 用 strtok() 函数分割字符串,找到需要提取的特定字符串后,调用 strtok() 传入 NULL 参数继续分割字符串获取下一个子串。
  • 3. C语言strncpy
    • 字符串的截取
    • 从左边开始截取n个字符
    • 从右边开始截取n个字符
    • 从中间某处截取一定长度的的子字符串
  • 4.C语言中将文件中的某行的字符串读取出来
    • 读取指定行
  • 5.提取包含特定内容的所有行
    • 读取包含指定内容的行数
  • 6.获取所在行
  • 7.清空字符串
  • 8.字符串给二维数组赋值

1. C 截取字符串,截取两个子串中间的字符串

linux

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void str_save_param(char * str,char left_str[],char right_str[],char result[]){char *ret = NULL;char *ret2;char *aaa = NULL;int left_str_len;//判断是否包含匹配字符串if( strstr(str, left_str)){//获取左边字符串的长度left_str_len = strlen(left_str);//获取匹配左边字符串ret = (char*) strstr(str, left_str);//删除掉左边字符串ret2 = (char *)malloc(strlen(ret));memset(ret2,0,sizeof(ret2));strcpy(ret2,ret+left_str_len);//lr_error_message("ret2字符串是 - |%s|\n", ret2);//获取右边匹配字符串aaa = (char*) strstr(ret2, right_str);if(aaa){memset(result,'\0',sizeof(result));//获取中间字符串strncpy(result, ret2, strlen(ret2) - strlen(aaa) );//lr_error_message("result字符串是 - |%s|\n", result);}free(ret2);} 
}int main()
{char str[] = "=gfafgs/gafdbafd/a9999999jkhjhkjkkjjjnjf12\n\r";char left_str[] = "=";char right_str[] ="\r";char result[1024];str_save_param(str,left_str,right_str,result);printf("result......|   %s   |.......\n", result);return 0;
}

BUG
在这里插入图片描述
在这里插入图片描述

串口AT指令

// 截取字符串,截取两个子串中间的字符串
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;
} 

4.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;
}

5.提取包含特定内容的所有行

#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;   
} 

6.获取所在行

#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"));
}

7.清空字符串

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就是空串了

8.字符串给二维数组赋值

 char newpath[5][10];strcpy(newpath[0], devnode); 
char str[3][10] = {"hello", "world", "c"}; 
char str[3][10]; 
FILE *fp = fopen("file.txt", "r"); 
if (fp != NULL) { int i = 0; while (fgets(str[i], 10, fp) != NULL && i < 3) { i++; } fclose(fp); 
} 

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

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

相关文章

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下&#xff0c;代码很简单&#xff0c;有几点要注意&#xff0c; 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时&#xff0c;如果需要插入空格&#xff0c;要使用双引号 cmd_ay(1) 0x33; …

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS DMIPS&#xff08;Dhrystone Million Instructions Per Second&#xff09;&#xff1a; DMIPS用于衡量计算机系统的整体指令执行性能&#xff0c;通常关注整数操作。它基于Dhrystone基准测试来计算&#xff0c;该测试主要包含整数运…

需求管理系统大盘点,谁能问鼎行业王者宝座?

“需求管理系统有哪些&#xff1f;这些品牌引领行业新风潮&#xff1a;Zoho Projects、SAP SuccessFactors、Oracle NetSuite、Microsoft Dynamics 365、Infor CloudSuite、JDA Software。” 需求管理系统是一种专门用于收集、分析和跟踪客户需求的工具&#xff0c;可以帮助企业…

总线:特性、分类、性能指标、系统总线的结构、总线仲裁、总线定时、总线标准

总线&#xff08;Bus&#xff09;&#xff0c;是一组为各功能部件之间进行信息传送的公共线路。 总线的特性&#xff1a; 机械特性&#xff08;物理特性&#xff09;&#xff1a;尺寸、形状、引脚数、排列顺序。电气特性&#xff1a;每根信号线上的信号传输方向、表示信号有效…

Go实现LogAgent:海量日志收集系统【上篇——LogAgent实现】

Go实现LogAgent 项目架构图&#xff1a; 0 项目背景与方案选择 背景 当公司发展的越来越大&#xff0c;业务越来越复杂时&#xff0c;每个业务系统都有自己的日志。此时我们就应该将不同业务线的日志进行实时收集&#xff0c;存储到一个日志收集中心&#xff0c;最后再通过…

RecyclerView的局部刷新居然这么简单

RecyclerView的局部刷新 面试时经常被问到Android列表控件RecyclerView&#xff0c;无非就是深入源码与ListView进行对比&#xff0c;四层缓存和局部刷新。而今天的重点就是局部刷新 使用场景 我们在使用RecyclerView的局部刷新时&#xff0c;往往使用notify相关方法&#xff…

Android studio 软件git使用

在 test 分支添加的方法 , 现在切换到 master分支 总共 2 个分支 , 当前的分支是 test 出现了 先试一下 force checkout , 尝试之后发现 , 你更改没有带过来 , 以为哪个类在master分支没有 , 所以这边也没有 , 切回分支 test 发现之前的跟改没有 , 这样即可以找回 继续切换…

MySQL—MySQL主从如何保证强一致性

一、前言 涉及到的东西&#xff1a;两阶段提交&#xff0c;binlog三种格式 1、两阶段提交 在持久化 redo log 和 binlog 这两份日志的时候&#xff0c;如果出现半成功的状态&#xff0c;就会造成主从环境的数据不一致性。这是因为 redo log 影响主库的数据&#xff0c;binlog…

python爬虫—requests

一、安装 pip install requests 二、基本使用 1、基本使用 类型 &#xff1a; models.Response r.text : 获取网站源码 r.encoding &#xff1a;访问或定制编码方式 r.url &#xff1a;获取请求的 url r.content &#xff1a;响应的字节类型 r.status_code &#xff1a;响应…

界面控件DevExpress WinForms(v23.2)下半年发展路线图

本文主要概述了官方在下半年&#xff08;v23.2&#xff09;中一些与DevExpress WinForms相关的开发计划&#xff0c;重点关注的领域将是可访问性支持和支持.NET 8。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能…

数据库访问性能优化

目录 IO性能分析数据库性能优化漏斗法则1、减少数据访问&#xff08;减少磁盘访问&#xff09;(1) 正确的创建并使用索引索引生效场景索引失效场景判断索引是否生效--执行计划 2、返回更少数据&#xff08;减少网络传输或磁盘访问&#xff09;(1) 数据分页处理(减少行数)客户端…

字符和字符串的库函数模拟与实现

前言&#xff1a; 相信大家平常在写代码的时候&#xff0c;用代码解决实际问题时苦于某种功能的实现&#xff0c;而望而止步&#xff0c;这个时候库函数的好处就体现出来了&#xff0c;当然个人代码编写能力强的可以自己创建一个函数&#xff0c;不过相当于库函数来说却是浪费了…

Redis进阶 - JVM进程缓存

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis进阶 - JVM进程缓存 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html 传统缓存的问题 传统的缓存策略一般是请求到达 Tomcat 后&#xff0c;先查询 Redis &…

Java文件操作

目录 一、File类概述 1.1 使用案例 二、文件内容的读写 2.1 字符流 2.1.1 读取文件 2.1.2 写入文件 2.2 字节流 2.2.1 读取文件 2.2.2 写入文件 对于Java操作文件&#xff0c;具体详情可以参考Java api文档 中的Java.io.File类 一、File类概述 首先先了解一下File类中常见的属…

Unity 从2018升级为2021之后 IAP(内购插件)报错解决

从老项目升级为2021高版本之后报了个错 大概就是… the type iwindowsiap exists in both unityengine.purchasing.winrtcore, version0.0.0.0, 这种 具体的我也没粘贴全部过来 原因貌似是 PackManger里面的IPA包和项目自带的冲突了 解决方法&#xff1a; 删除项目文件夹下面…

leetcode3. 无重复字符的最长子串(滑动窗口 - java)

滑动窗口 无重复字符的最长子串滑动窗口 上期经典 无重复字符的最长子串 难度 - 中等 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc…

代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

代码随想录算法训练营第五十二天 | 300.最长递增子序列&#xff0c;674. 最长连续递增序列&#xff0c;718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接 视频讲解 给你一个整数数组 nums &#xff0c;找到其中最…

JDK源码解析-LinkedList

1. LinkedList类 1.1 LinkedList类定义&数据结构 定义 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列&#xff0c;它是基于双向链表实现的。 数据结构 基础知识补充 单向链表&#xff1a; element&#xff1a;用来存放元素 next&#xff1a;用来…

SpringBoot项目(jar)部署,启动脚本

需求 SpringBoot项目&#xff08;jar&#xff09;部署&#xff0c;需要先关闭原来启动的项目&#xff0c;再启动新的项目。直接输入命令&#xff0c;费时费力&#xff0c;还容易出错。所以&#xff0c;使用脚本启动。 脚本 脚本名&#xff1a;start.sh 此脚本需要放置在jar包…

AI文本标注的概念,类型和方法

我们每天都在与不同的媒介&#xff08;例如文本、音频、图像和视频&#xff09;交互&#xff0c;我们的大脑对收集到的信息进行处理和加工&#xff0c;从而指导我们的行为。在我们日常接触到的信息中&#xff0c;文本是最常见的媒体类型之一&#xff0c;由我们交流使用的语言构…