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.rhkb.cn/news/115594.html

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

相关文章

如何在小程序中给会员设置备注

给会员设置备注是一项非常有用的功能&#xff0c;它可以帮助商家更好地管理和了解自己的会员。下面是一个简单的教程&#xff0c;告诉商家如何在小程序中给会员设置备注。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要设置备注的会员卡。也支持对会…

宠物赛道,用AI定制宠物头像搞钱项目教程

今天给大家介绍一个非常有趣&#xff0c;而粉丝价值又极高&#xff0c;用AI去定制宠物头像或合照的AI项目。 接触过宠物行业应该知道&#xff0c;获取1位铲屎官到私域&#xff0c;这类用户的价值是极高的&#xff0c;一个宠物粉&#xff0c;是连铲个屎都要花钱的&#xff0c;每…

USRP 简介,对于NI软件无线电你所需要了解的一切

什么是 USRP 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发&#xff0c;被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&…

本地部署 Stable Diffusion(Mac 系统)

在 Mac 系统本地部署 Stable Diffusion 与在 Windows 系统下本地部署的方法本质上是差不多的。 一、安装 Homebrew Homebrew 是一个流行的 macOS &#xff08;或 Linux&#xff09;软件包管理器&#xff0c;用于自动下载、编译和安装各种命令行工具和应用程序。有关说明请访问官…

【分享】PDF如何拆分成2个或多个文件呢?

当我们需要把一个多页的PDF文件拆分成2个或多个独立的PDF文件&#xff0c;可以怎么操作呢&#xff1f;这种情况需要使用相关工具&#xff0c;下面小编就来分享两个常用的工具。 1. PDF编辑器 PDF编辑器不仅可以用来编辑PDF文件&#xff0c;还具备多种功能&#xff0c;拆分PDF文…

GPT-4.0技术大比拼:New Bing与ChatGPT,哪个更适合你

随着GPT-4.0技术的普及和发展&#xff0c;越来越多的平台开始将其应用于各种场景。New Bing已经成功接入GPT-4.0&#xff0c;并将其融入搜索和问答等功能。同样&#xff0c;在ChatGPT官网上&#xff0c;用户只需开通Plus账号&#xff0c;即可体验到GPT-4.0带来的智能交流和信息…

使用flink sqlserver cdc 同步数据到StarRocks

前沿&#xff1a; flink cdc功能越发强大&#xff0c;支持的数据源也越多&#xff0c;本篇介绍使用flink cdc实现&#xff1a; sqlserver-》&#xff08;using flink cdc&#xff09;-〉flink -》&#xff08;using flink starrocks connector&#xff09;-〉starrocks整个流程…

小游戏分发平台如何以技术拓流?

2023年&#xff0c;小游戏的发展将受到多方面的影响&#xff0c;例如新技术的引入、参与小游戏的新玩家以及游戏市场的激烈竞争等。首先&#xff0c;新技术如虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和机器人技术都可以带来新颖的游戏体验。其…

嘉泰实业和您共创未来财富生活

每一次暖心的沟通都是一次公益,真诚不会因为它的渺小而被忽略;每一声问候都是一次公益,善意不会因为它的普通而被埋没。熟悉嘉泰实业的人都知道,这家企业不但擅长在金融理财领域里面呼风唤雨,同时也非常擅长在公益事业当中践行,属于企业的责任心,为更多有困难的群体带来大爱的传…

大数据课程K13——Spark的距离度量相似度度量

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的距离度量和相似度度量; ⚪ 掌握Spark的欧氏距离; ⚪ 掌握Spark的曼哈顿距离; ⚪ 掌握Spark的切比雪夫距离; ⚪ 掌握Spark的最小二乘法; 一、距离度量和相似度度量 1. …

打磨 8 个月、功能全面升级,Milvus 2.3.0 文字发布会现在开始!

Milvus 社区的各位伙伴&#xff1a; 大家晚上好&#xff01;欢迎来到 Milvus 2.3.0 文字发布会&#xff01; 作为整个团队的匠心之作&#xff0c;Milvus 2.3.0 历经 8 个月的设计与打磨&#xff0c;无论在新功能、应用场景还是可靠度方面都有不小的提升。 具体来看&#xff1a;…

UG\NX CAM二次开发 插入工序 UF_OPER_create

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 插入工序 UF_OPER_create 效果: 代码: void MyClass::do_it() {tag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);if (setup_tag==NULL_TAG){uc1601("请先初始化加工环境…

【Ubuntu】解决ubuntu虚拟机和物理机之间复制粘贴问题(无需桌面工具)

解决Ubuntu虚拟机和物理机之间复制粘贴问题 第一步 先删除原来的vmware tools&#xff08;如果有的话&#xff09; sudo apt-get autoremove open-vm-tools第二步 安装软件包&#xff0c;一般都是用的desktop版本&#xff08;如果是server换一下&#xff09; sudo apt-get …

开源vue动态表单组件

一、项目简介 vueelement的动态表单组件&#xff0c;拖拽组件到面板即可实现一个表单 二、实现功能 支持拖拽 支持输入框 支持文本框 支持数字输入框 支持下拉选择器 支持多选框 支持日期控件 支持开关 支持动态表格 支持上传图片 支持上传文件 支持标签 支持ht…

简单了解网络传输介质

目录 一、同轴电缆 二、双绞线 三、光纤 四、串口电缆 一、同轴电缆 10BASE前面的数字表示传输带宽为10M&#xff0c;由于带宽较低、现在已不再使用。 50Ω同轴电缆主要用来传送基带数字信号&#xff0c;因此也被称作为基带同轴电缆&#xff0c;在局域网中得到了广泛的应用…

基于OFDM的水下图像传输通信系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 function [rx_img] func_TR(tx_img, num_path, pathdelays, pathgains, snr) rng(default); …

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…

Ubuntu 22.04安装 —— Win11 22H2

目录 Ubuntu使用下载UbuntuVmware 安装图示安装步骤图示 Ubuntu使用 系统环境&#xff1a; Windows 11 22H2Vmware 17 ProUbutun 22.04.3 Server Ubuntu Server documentation | Ubuntu 下载 Ubuntu 官网下载 建议安装长期支持版本 ——> 可以选择桌面版或服务器版(仅包…

cocos 2.4 版本 设置物理引擎步长 解决帧数不一致的设备 物理表现不一致问题 设置帧刷新率

官网地址Cocos Creator 3.8 手册 - 2D 物理系统 官网好像写的不太对 下面是我自己运行好使的 PhysicsManager.openPhysicsSystem()var manager cc.director.getPhysicsManager();// 开启物理步长的设置manager.enabledAccumulator true;// cc.PhysicsManagercc.PhysicsManag…

飞桨中的李宏毅课程中的第一个项目——PM2.5的预测

所谓的激活函数&#xff0c;就是李宏毅老师讲到的sigmoid函数 和 hard sigmoid函数 &#xff0c;ReLU函数那些 现在一点点慢慢探索&#xff0c;会成为日后想都做不到的经历&#xff0c;当你啥也不会的时候&#xff0c;才是慢慢享受探索的过程。 有一说一&#xff0c;用chatGP…