linux字符串处理

news2024/11/26 2:25:08

目录

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

输出结果为:

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>
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];
int num=0;
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  0;
}

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

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

相关文章

c语言六子棋(Alpha-Beta剪枝算法)

c语言Alpha-Beta剪枝算法六子棋介绍 Alpha-Beta剪枝算法是一种用于优化博弈树搜索的算法&#xff0c;可以在搜索过程中减少不必要的计算&#xff0c;从而提高搜索效率。该算法常用于博弈游戏&#xff0c;如六子棋。 六子棋是一种类似于五子棋的棋类游戏&#xff0c;在一个六边形…

C#: Json序列化和反序列化,集合为什么多出来一些元素?

如下面的例子&#xff0c;很容易看出问题&#xff1a; 如果类本身的无参构造函数&#xff0c; 就添加了一些元素&#xff0c;那么在序列化&#xff0c;再反序列化&#xff0c;会导致元素增加。 如果要避免&#xff0c;必须添加&#xff1a; new JsonSerializerSettings() { …

目标检测(凑字数,凑字数,为什么标题一定要五个字)

写在最前&#xff1a; 昨天七夕&#xff0c;一个人躲在家里打游戏&#xff0c;不敢出门&#xff0c;怕被喂狗粮。 一个即将步入中年的老男人&#xff0c;弱小&#xff0c;无助&#xff0c;单身&#xff0c;肥胖&#xff0c;贫穷。但是怀揣着一丢丢情怀和梦想&#xff0c;妄图吃…

运算符(个人学习笔记黑马学习)

算数运算符 加减乘除 #include <iostream> using namespace std;int main() {int a1 10;int a2 20;cout << a1 a2 << endl;cout << a1 - a2 << endl;cout << a1 * a2 << endl;cout << a1 / a2 << endl;/*double a3 …

github加速方式

windows系统访问github加速方式 第一步&#xff1a;查询dns地址第二步&#xff1a;host文件添加dns映射第三步&#xff1a;刷新dns 第一步&#xff1a;查询dns地址 查询工具&#xff1a;https://coding.tools/cn/nslookup 依次将以下网址的ip查询出来&#xff1a; github.com …

javaee之黑马乐优商城1

问题1&#xff1a;整体的项目架构与技术选型 技术选型 开发环境 域名测试 如何把项目起来&#xff0c;以及每一个目录结构大概是什么样子 通过webpack去启动了有个项目&#xff0c;这里还是热部署&#xff0c;文件改动&#xff0c;内容就会改动 Dev这个命令会生成一个本地循环…

睿趣科技:抖音开网店卖玩具怎么样

近年来&#xff0c;随着社交媒体平台的飞速发展&#xff0c;抖音作为一款短视频分享应用也迅速崭露头角。而在这个充满创业机遇的时代背景下&#xff0c;许多人开始探索在抖音平台上开设网店&#xff0c;尤其是卖玩具类商品&#xff0c;那么抖音开网店卖玩具究竟怎么样呢? 首先…

Vue2(状态管理Vuex)

目录 一&#xff0c;状态管理Vuex二&#xff0c;state状态三&#xff0c;mutations四&#xff0c;actions五&#xff0c;modules最后 一&#xff0c;状态管理Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并…

Qt应用开发(基础篇)——对话框窗口 QDialog

一、前言 QDialog类继承于QWidget&#xff0c;是Qt基于对话框窗口(消息窗口QMessageBox、颜色选择窗口QColorDialog、文件选择窗口QFileDialog等)的基类。 QDialog窗口是顶级的窗口&#xff0c;一般情况下&#xff0c;用来当做用户短期任务(确认、输入、选择)或者和用户交流(提…

Royal TSX for Mac:苹果电脑远程桌面,轻松管理,完美兼容版

Royal TSX for Mac是一款功能强大、易于使用且安全稳定的远程连接管理软件。无论您是IT专业人士还是普通用户&#xff0c;它都能满足您对远程工作的需求。在一个直观友好的界面下&#xff0c;Royal TSX提供了广泛的远程连接支持&#xff0c;并具备灵活性和扩展性。无论是作为个…

xxl-job学习(一遍文章解决)

前言&#xff1a;学习xxl-job需要有git&#xff0c;springboot的基础&#xff0c;学起来就很简单 xxl-job是一个分布式的任务调度平台&#xff0c;其核心设计目标是&#xff1a;学习简单、开发迅速、轻量级、易扩展&#xff0c;现在已经开放源代码并接入多家公司的线上产品线&a…

【历史上的今天】8 月 28 日:微软创始人控诉苹果谷歌;人工智能医学领域先驱出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 8 月 28 日&#xff0c;在 123 年前的今天&#xff0c;百事可乐公司成立&#xff0c;影响了无数人的闲暇生活&#xff0c;其中的一届 CEO 更是在跳槽之后改变了…

计算机视觉与人工智能在医美人脸皮肤诊断方面的应用

一、人脸皮肤诊断方法 近年来&#xff0c;随着计算机技术和人工智能的不断发展&#xff0c;中医领域开始逐渐探索利用这些先进技术来辅助面诊和诊断。在皮肤望诊方面&#xff0c;也出现了一些现代研究&#xff0c;尝试通过图像分析技术和人工智能算法来客观化地获取皮肤相关的…

数据库相关知识2

数据库知识2 关系完整性 数据完整性 指的是数据库中的数据的准确性和可靠性 实体完整性约束&#xff1a; 目的&#xff1a; 在表中至少有一个唯一的 标识&#xff0c;主属性字段中&#xff0c;不为空&#xff0c;不重复 主键约束&#xff1a;唯一 不重复 不为空 primary k…

Java:HashMap、LinkedHashMap、TreeMap集合的底层原理和集合的嵌套

HashMap的底层原理 LinkedHashMap的底层原理 TreeMap集合的底层原理 集合的嵌套

汽车制造行业,配电柜如何实施监控?

工业领域的生产过程依赖于高效、稳定的电力供应&#xff0c;而配电柜作为电力分配和控制的关键组件&#xff0c;其监控显得尤为重要。 配电柜监控通过实时监测、数据收集和远程控制&#xff0c;为工业企业提供了一种有效管理电能的手段&#xff0c;从而确保生产的连续性、安全性…

C++ 改善程序的具体做法 学习笔记

1、尽量用const enum inline替换#define 因为#define是做预处理操作&#xff0c;编译器从未看见该常量&#xff0c;编译器刚开始编译&#xff0c;它就被预处理器移走了&#xff0c;而#define的本质就是做替换&#xff0c;它可能从来未进入记号表 解决方法是用常量替换宏 语言…

linux 设置与命令基础(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、系统基本操作 二、命令类型 三、命令语法 四、命令补齐 五、命令帮助 六、系统基本操作命令 总结 前言 这是本人学习Linux的第二天&#xff0c;今天主…

Unity插件---Dotween

1.什么是DOTween DoTween 是由 Demigiant 开发的&#xff0c;被广泛应用于 Unity 游戏开发中。它是一个流行的动画插件&#xff0c;被许多开发者用于创建流畅、高效的动画效果&#xff0c;提升游戏体验。 2.DOTween的初始配置 ①set up 首先找到DOTween Unity Panel 的面板 点…

机器学习资料汇总

一 卷积 原来卷积是这么计算的 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/268179286 最核心的部分是要知道&#xff0c;通道数和输出特征图无关&#xff0c;是卷积核的个数&#xff0c;决定了输出特征图的个数