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

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

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

相关文章

SMC_TRAFO_GantryCutter2 (FB) 带刀片旋向龙门

裁布机&#xff1a;刀片按XY走向&#xff0c;偏转刀片角度。 pi&#xff1a;目标位置矢量&#xff08;x&#xff0c;y&#xff09;&#xff0c;插值器的输出 v&#xff1a;当前路径切线的矢量&#xff0c;插值器的输出 dOffsetX&#xff1a; x轴的附加偏移 dOffsetY&#xf…

Kafka 简介 + 学习笔记

消息队列 先说明消息队列是什么&#xff1a; 亚马逊&#xff1a; 消息队列是一种异步的服务间通信方式&#xff0c;适用于微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高…

34、springboot切换内嵌Web服务器(Tomcat服务器)与 生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS

知识点1&#xff1a;springboot切换内嵌Web服务器&#xff08;Tomcat服务器&#xff09; 知识点2&#xff1a;生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS ★ Spring Boot默认的Web服务器&#xff08;Tomcat&#xff09; ▲ 基于Servlet的应用&#xff08;使用Spring MV…

git-tf clone 路径有空格处理方案

git-tf clone 路径存在空格情况下&#xff0c;运行命令报错&#xff1b; 需要对路径进行双引号处理

null值 字段运算

null值字段运算前先把null转成0 test表如下&#xff0c;num2为null select num1-num2 from test; 结果为null减去null值结果为null select sum(num1),SUM(num2) from test ;sum求和结果为null 判断字段是null不能用 null ,要用is null 错误写法&#xff1a; select IF(…

【ES】笔记-Promise基本使用

笔记-基本使用 一、初始Promise1. 抽象表达:2. 具体表达:为什么要用 Promise?promise的基本流程 二、fs读取文件三、AJAX请求四、Promise封装fs模块五、util.promisify方法六、Promise封装AJAX操作 一、初始Promise 1. 抽象表达: 1. Promise 是一门新的技术(ES6 规范) 2. Pr…

嵌入式学习笔记——ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集&#xff08;32-bit&#xff09; Thumb态-Thumb指令集&#xff08;16-bit&#xff09; Thumb2态-Thumb2指令集&#xff08;16 & 32 bit&#xff09; Thumb指令集是对ARM指令集的一个子集重新编码得到的&#xff0c;指令长度为16位。通常在…

设备健康管理如何减少维护成本?

在现代制造和工业领域&#xff0c;设备健康管理已经成为降低维护成本和提高生产效率的关键策略。通过实时监测和数据分析&#xff0c;预测性维护等方法已经取得了显著的成果&#xff0c;帮助企业在维护方面实现成本效益和效率的提升。本文将以PreMaint设备数字化平台为例&#…

Kubernetes(K8s 1.28.x)部署---超详细

目录 一、基础环境配置&#xff08;所有主机均要配置&#xff09; 1、配置IP地址和主机名、hosts解析 2、关闭防火墙、禁用SELinux 3、安装常用软件 4、配置时间同步 5、禁用Swap分区 6、修改linux的内核参数 7、配置ipvs功能 二、容器环境操作 1、定制软件源 2、安…

自动化测试之Selenium

自动化测试Selenium介绍环境搭建如何操作浏览器定位元素css类选择器定位元素xpath定位元素css选择语法xpath选择语法 常用操作添加等待打印信息浏览器更多操作键盘事件鼠标事件特殊场景只选复选框iframe标签下拉框处理弹窗显示上传文件 关闭浏览器切换窗口截图 自动化测试 自动…

Python爬虫分布式架构问题汇总

在使用Python爬虫分布式架构中可能出现以下的问题&#xff0c;我们针对这些问题&#xff0c;列出相应解决方案&#xff1a; 1、任务重复执行 在分布式环境下&#xff0c;多个爬虫节点同时从消息队列中获取任务&#xff0c;可能导致任务重复执行的问题。 解决方案&#xff1a;…

C语言(第三十二天)

1. 递归是什么&#xff1f; 递归是学习C语言函数绕不开的一个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 写一个史上最简单的C语言递归代码&#xff1a; #include <stdio.h>…