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接收到的数据发送到串口1
  	memset(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);
    else
        printf("获取到的文本是: \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就是空串了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十四五双碳双控时代下的“低碳认证”

目录 前言 十四五双碳双控时代下的“低碳认证” 一、关于“低碳认证” 二、低碳认证优势 三、环境产品认证EPD 四、EPD相关运营机构 五、碳中和相关机构 六、EPD的认证流程 七、低碳产品认证认证流程和要求 八、相关机构认证证书样例 九、证书附件表 前言 通过本篇文…

DOCKER 部署 webman项目

# 设置基础镜像 FROM php:8.2-fpm# 安装必要的软件包和依赖项 RUN apt-get update && apt-get install -y \nginx \libzip-dev \libpng-dev \libjpeg-dev \libfreetype6-dev \&& rm -rf /var/lib/apt/lists/*# 安装 PHP 扩展 RUN docker-php-ext-configure gd …

探讨C#、C++和Java这三门语言在嵌入式的地位

我理解对于初入嵌入式领域的担忧。你是想选择一款通用性最广的语言专心学习&#xff0c;但是不知如何选择&#xff0c;视频后方提供了免费的嵌入式学习资源&#xff0c;内容涵盖入门到进阶&#xff0c;需要的到后方免费获取。因为我也曾是一名计算机专业毕业生。通过一段时间的…

无涯教程-Python机器学习 - Analysis of Silhouette Score函数

剪影得分的范围是[-1,1]。其分析如下- 1分数-接近1 剪影分数表示样本距离其邻近簇很远。 0分数-0 剪影分数表示样本在将两个相邻聚类分隔开的决策边界上或非常接近。 -1分数-1 剪影分数表示样本已分配给错误的聚类。 Silhouette得分的计算可以使用以下公式完成 $$剪影得…

计算机竞赛 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

执行jmeter端口不够用报错(Address not available)

执行jmeter端口不够用报错(Address not available) linux解决方案 // 增加本地端口范围 echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range// 启用快速回收TIME_WAIT套接字 sudo sysctl -w net.ipv4.tcp_tw_recycle1// 启用套接字的重用 sudo sysctl -w net.ipv4.t…

LLM-Rec:基于提示大语言模型的个性化推荐

1. 基本信息 论文题目:LLM-Rec: Personalized Recommendation via Prompting Large Language Models 作者:Hanjia Lyu, Song Jiang, Hanqing Zeng, Yinglong Xia, Jiebo Luo 机构:University of Rochester, University of California Los Angeles, Meta AI, University of Ro…

STM32f103入门(4)对射式红外传感器计次(外部中断)

中断:在主程序运行过程中&#xff0c;出现了特定的中断触发条件 (中断源)&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行中断优先级:当有多个中断源同时申请中断时&#xff0c;CPU会根据中断源的轻重缓急进…

Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

在启动oracle的服务OracleOraDb11g_home1TNSListener时&#xff0c;提示服务启动后又停止了。 解决方法&#xff1a; 修改oracle安装目录下的两个配置文件&#xff1a; 以上两个文件&#xff0c;对应的HOST的值&#xff0c;都改为127.0.0.1 然后再启动服务&#xff0c;启动成…

秒懂算法2

视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…

Linux centos7 bash编程(小练习)

一、打印九九乘法口诀 这一个for循环嵌套的小练习&#xff0c;难度不大。提供一种写法&#xff0c;供参考&#xff1a; #!/bin/bash # 文件名&#xff1a;99table.sh # 打印输出九九乘法口诀表 for i in {1..9} do for ((j1;j<$i;j)) do …

⛳ Docker 安装 MySQL

&#x1f38d;目录 ⛳ Docker 安装 MySQL&#x1f69c; 一、搜索 mysql , 查看版本&#x1f3a8; 二、拉取mysql镜像&#x1f463; 三、建立容器的挂载文件&#x1f9f0; 四、创建mysql配置文件&#xff0c;my.conf&#x1f3ed; 五、根据镜像产生容器&#x1f381; 六、远程连…

2023MySQL+MyBatis知识点整理

文章目录 主键 外键 的区别&#xff1f;什么是范式&#xff1f;什么是反范式&#xff1f;什么是事务&#xff1f;MySQL事务隔离级别&#xff1f;MySQL事务默认提交模式&#xff1f;MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗&#xff1f;MySQL支持哪几种时间类型&a…

线性数据结构:数组与链表的探索与应用

文章目录 1. 数组&#xff1a;连续存储的有序元素集合1.1 创建和访问数组1.2 数组的搜索与排序 2. 链表&#xff1a;非连续存储的动态数据结构2.1 单链表与双链表2.2 链表的操作与应用 3. 数组与链表的比较与应用3.1 数组与链表的比较3.2 数组与链表的应用 4. 总结与展望 &…

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种强大且灵活的数据结构&#xff0c;用于管理和操作一系列元素。与数组相比&#xff0c;切片的大小可以动态调整&#xff0c;这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入&#xff0c;介…

如何在有或没有WiF适配器的情况下把台式机接入WiFi

Wi-Fi在台式电脑中越来越普遍,但并不是所有的台式电脑都有。添加Wi-Fi,你就可以无线连接到互联网,并为其他设备托管Wi-Fi热点。 这是一个简单、廉价的过程。买一个合适的小适配器,你甚至可以随身携带,通过将一个小设备插入USB端口,可以快速将Wi-Fi添加到你遇到的任何桌面…

screen命令,可以断开服务器连接,依旧能运行你的程序了

可以参考博客1&#xff1a;https://blog.csdn.net/nima_zhang_b/article/details/82797928 可以参考博客2:https://blog.csdn.net/herocheney/article/details/130984403 Linux中的screen是一个命令行工具&#xff0c;可以让用户在同一个终端会话中创建多个虚拟终端。它非常有…

element-ui 弹窗里面嵌套弹窗,解决第二个弹窗被遮罩层掩盖无法显示的问题

当我们在 element-ui 中使用弹窗嵌套弹窗时&#xff0c;会出现第二个弹窗打开时被一个遮罩层挡着&#xff0c;就像下面这样&#xff1a; 下面提供两种解决方案 &#xff1a; 一、第一种方案 我们查询element-ui 官网可以发现 el-dialog 有这样几个属性&#xff1a; 具体使用就…

Android Looper Handler 机制浅析

最近想写个播放器demo&#xff0c;里面要用到 Looper Handler&#xff0c;看了很多资料都没能理解透彻&#xff0c;于是决定自己看看相关的源码&#xff0c;并在此记录心得体会&#xff0c;希望能够帮助到有需要的人。 本文会以 猜想 log验证 的方式来学习 Android Looper Ha…

Jmeter接口测试+压力测试

接口测试 Jmeter-http接口脚本 一般分五个步骤:&#xff08;1&#xff09;添加线程组 &#xff08;2&#xff09;添加http请求 &#xff08;3&#xff09;在http请求中写入接入url、路径、请求方式和参数 &#xff08;4&#xff09;添加查看结果树 &#xff08;5&#xff09;…