linux c 字符串函数 replace indexOf substring 实现
c语言没有像java那么丰富的字符串操作函数,很多有用的函数得自己写,搞了一天,写了几个常用函数,留着以后有用。
mystr.c:
#include <string.h>
#include <stdio.h>/*将str1字符串中第一次出现的str2字符串替换成str3*/
void replaceFirst(char *str1, char *str2, char *str3)
{char str4[strlen(str1) + 1];char *p;strcpy(str4, str1);if ((p = strstr(str1, str2)) != NULL)/*p指向str2在str1中第一次出现的位置*/{while (str1 != p && str1 != NULL)/*将str1指针移动到p的位置*/{str1++;}str1[0] = '\0';/*将str1指针指向的值变成/0,以此来截断str1,舍弃str2及以后的内容,只保留str2以前的内容*/strcat(str1, str3);/*在str1后拼接上str3,组成新str1*/strcat(str1, strstr(str4, str2) + strlen(str2));/*strstr(str4,str2)是指向str2及以后的内容(包括str2),strstr(str4,str2)+strlen(str2)就是将指针向前移动strlen(str2)位,跳过str2*/}
}/*将str1出现的所有的str2都替换为str3*/
void replace(char *str1, char *str2, char *str3)
{while (strstr(str1, str2) != NULL){replaceFirst(str1, str2, str3);}
}/*截取src字符串中,从下标为start开始到end-1(end前面)的字符串保存在dest中(下标从0开始)*/
void substring(char *dest, char *src, int start, int end)
{int i = start;if (start > strlen(src)){return;}if (end > strlen(src)){end = strlen(src);}while (i < end){dest[i - start] = src[i];i++;}dest[i - start] = '\0';return;
}/*返回src中下标为index的字符*/
char charAt(char *src, int index)
{char *p = src;int i = 0;if ((index < 0) || (index > strlen(src))){return 0;}while (i < index){i++;}return p[i];
}/*返回str2第一次出现在str1中的位置(下表索引),不存在返回-1*/
int indexOf(char *str1, char *str2)
{char *p = str1;int i = 0;p = strstr(str1, str2);if (p == NULL){return -1;}else{while (str1 != p){str1++;i++;}}return i;
}/*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/
int lastIndexOf(char *str1, char *str2)
{char *p = str1;int i = 0, len = strlen(str2);p = strstr(str1, str2);if (p == NULL){return -1;}while (p != NULL){for (; str1 != p; str1++){i++;}p = p + len;p = strstr(p, str2);}return i;
}/*删除str左边第一个非空白字符前面的空白字符(空格符和横向制表符)*/
void ltrim(char *str)
{int i = 0, j, len = strlen(str);while (str[i] != '\0'){if ((str[i] != 32) && (str[i] != 9)){break; /*32:空格,9:横向制表符*/}i++;}if (i != 0){for (j = 0; j <= len - i; j++){str[j] = str[j + i];/*将后面的字符顺势前移,补充删掉的空白位置*/}}
}/*删除str最后一个非空白字符后面的所有空白字符(空格符和横向制表符)*/
void rtrim(char *str)
{char *p = str;int i = strlen(str) - 1;while (i >= 0){if ((p[i] != 32) && (p[i] != 9)){break;}i--;}str[++i] = '\0';
}/*删除str两端的空白字符*/
void trim(char *str)
{ltrim(str);rtrim(str);
}
mystr.h:
extern void replaceFirst(char *str1, char *str2, char *str3);
extern void replace(char *str1, char *str2, char *str3);
extern void substring(char *dest, char *src, int start, int end);
extern char charAt(char *src, int index);
extern int indexOf(char *str1, char *str2);
extern int lastIndexOf(char *str1, char *str2);
extern void ltrim(char *str);
extern void rtrim(char *str);
extern void trim(char *str);
再写个测试文件test.c:
#include <string.h>
#include <stdio.h>
#include "mystr.h"
void main()
{char buf[20] = "012345126";char buf2[10];replaceFirst(buf, "12", "9999");printf("replaceFirst:%s\n", buf);strcpy(buf, "012345126");replace(buf, "12", "9999");printf("replace:%s\n", buf);strcpy(buf, "01234560");substring(buf2, buf, 2, 5);printf("substring:%s\n", buf2);printf("charAt:%c\n", charAt(buf, 4));printf("indexOf:%d\n", indexOf(buf, "234"));printf("lastIndexOf:%d\n", lastIndexOf(buf, "0"));strcpy(buf, " 0123 ");ltrim(buf);printf("ltrim:||%s||\n", buf);strcpy(buf, " 0123 ");rtrim(buf);printf("rtrim:||%s||\n", buf);strcpy(buf, " 0123 ");trim(buf);printf("trim:||%s||\n", buf);strcpy(buf, " ");trim(buf);printf("trim2:||%s||\n", buf);
}
编译运行如下:
gcc test.c mystr.c -o str./str# 结果如下
replaceFirst:09999345126replace:0999934599996substring:234charAt:4indexOf:2lastIndexOf:7ltrim:||0123 ||rtrim:|| 0123||trim:||0123||trim2:||||
linux c 字符串函数 replace indexOf substring 实现相关推荐
- SQL替换字符串函数replace()
REPLACE ( str, from_str, to_str ) str:需要被修改的字符串 from_str:要被替换的子字符串 to_str :新的子字符串 SELECT REPLACE(&qu ...
- Linux C 字符串函数sprintf()和snprinttf()
sprintf()函数详解 int sprintf( char *buffer, const char *format , - ); 函数说明:将格式化的字符串输入到buffer中. 函数返回值:bu ...
- linux截取字符串函数,Linux下实现字符串截取方法总结
Linux下实现字符串截取,大体上可以分为两种,使用命令实现截取,使用工具实现截取.具体截取方式如下: a.#截取,可以实现删除左边字符,保留右边字符 从左边第一个>开始,删除>及之前的所 ...
- 字符串函数 replace() 方法妙用
alert('10 12 14 16'.replace(/d+/g,function(match){return parseInt(match,10) > 10 ? '*' : match; } ...
- insert 语句_替换某字段中的特定字符串——MySQL REPLACE 与INSERT 函数详解
MySQL提供了一个非常实用的字符串函数--REPLACE() 函数,它允许用新的字符串替换字段中的特定字符串,而不再需要自己写函数去替换,用起来非常的方便. REPLACE() 函数语法 需要注意的 ...
- linux进程snprintf函数功能,linux 之 snprintf函数用法
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
- pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)
pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe) 目录
- pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe)
pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe) 目录
- jstl 处理字符串函数 substring spli等
在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri="http://java.sun.com/jsp/jstl/f ...
最新文章
- Resources$NotFoundException Resource is not a Drawable (color or path) 问题解决
- 甲骨文严查Java授权,企业连夜删除JDK
- mysql查询包含字符串(模糊查询)
- 【转】打印机硬件发现不了解决办法
- linux qt目录查看,QT遍历目录获取文件信息
- 原生 js 生成二维码
- vs2010和matlab混合编程,VS2010与Matlab2010b混合编程
- Android 项目必备(二十)-->NFC 的基本使用
- 怎么用imp命令把dmp文件从本地导入到远处的数据库服务器,Oracle 数据库导入导出dmp文件...
- Visual Studio部署HoloLens 找不到WindowsMobile SDK
- ArcGIS中裁剪(clip)出现000117错误的解决办法
- 自己写的一个AI输入滤波函数
- IGRP和EIGRP的无缝结合
- keyshot Pro for Mac(3D渲染和动画制作)兼容big sur
- 2021 12月CSP认证心得
- Infortrend混合存储推动大体量血站IT系统全面升级
- 【U8】填制凭证输入完摘要,回车后报错运行时错误70,拒绝的权限。
- bert模型可以做文本主题识别吗_文本匹配方法系列––BERT匹配模型
- 怎么样才能在服务器显示皮肤,我的世界正不显示皮肤,怎么在右上角显示出皮肤...
- exp oracle远程主机,cmd oracle exp 远程数据库命令
热门文章
- Netflow/IPFIX 流量收集与分析
- 运放电路复习,放大器、加法器、积分器、差分放大电路等
- 解压缩工具 WinRAR 5.71 + x64 Final 中文汉化版
- 大势所趋,应用如何适配Android P HEIF图片格式
- java 实现HTTP连接(HTTPClient)
- 关于向Mybatis传递多个参数进行SQL查询的用法
- 转载/JSTL/attribute value does not accept any express
- 第 4 章 Glance - 022 - 如何使用 OpenStack CLI
- jquery gridly (拖拽插件)
- 二维几何变换---OpenGL几何变换编程示例