供参考学习~

下载链接(没法更新的):https://download.csdn.net/download/sxf1061700625/13090575

stringUtil.h

#ifndef _STRINGUTIL_H
#define _STRINGUTIL_H#define true  1
#define false 0
typedef char* String;
typedef char** Array_t;
typedef unsigned char Bool;typedef struct
{char* (*addExtra)(char*, char*);char* (*add)(char*, char*);char* (*newString)(int, ...);void  (*delString)(char*);int   (*split)(char*, char*, Array_t*);int   (*splitExtra)(char*, char*, Array_t*);void  (*delArray)(Array_t, int);char* (*toUpper)(char*);char* (*toLower)(char*);Bool  (*startWith)(char*, char*);Bool  (*endWith)(char*, char*);char* (*join)(Array_t, int);char* (*strip)(char*, char*);
}STRINGUTIL;
extern STRINGUTIL StringUtil;void stringUtilTest(void);#endif

stringUtil.c

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include "stdarg.h"
#include "stringUtil.h"static char* addExtra(char* p1, char* p2);
static char* add(char* p1, char* p2);
static char* newString(int num, ...);
static void  delString(char* p);
static int   split(char* buff, char* separator, Array_t* result);
static int   splitExtra(char* buff, char* separator, Array_t* result);
static void  delArray(Array_t p, int n);
static char* toUpper(char* ptr);
static char* toLower(char* ptr);
static Bool  startWith(char* src, char* str);
static Bool  endWith(char* src, char* str);
static char* join(Array_t ptr, int n);
static char* strip(char* ptr, char* separator);STRINGUTIL StringUtil = {.add=add,.addExtra=addExtra,.newString=newString,.delString=delString,.split=split,.splitExtra=splitExtra,.delArray=delArray,.toUpper=toUpper,.toLower=toLower,.startWith=startWith,.endWith=endWith,.join=join,.strip=strip};/*** @description: 字符串合并* @param {p1} 字符串1* @param {p2} 字符串2* @return {*} 合并后的字符串指针p1* @attention 会释放p1,所以调用时等号左边要有,不能省略,否则用的是已经释放的旧地址。如:str = stringUtil.add(p1,p2)*/
static char* addExtra(char* p1, char* p2)
{char* ptr = NULL;ptr = (char*)realloc(p1, strlen(p1)+strlen(p2)+1);if (ptr != NULL) {strcat(ptr, p2);}return ptr;
}/*** @description: 字符串合并* @param {p1} 字符串1* @param {p2} 字符串2* @return {*} 合并后的字符串指针p1* @attention 会创建一个新的字符串返回*/
static char* add(char* p1, char* p2)
{char* ptr = NULL;ptr = (char*)calloc(strlen(p1)+strlen(p2)+1, 1);if (ptr != NULL) {strcat(ptr, p1);strcat(ptr, p2);}return ptr;
}/*** @description: 创建字符串* @param {num} 字符串数组的个数* @param {...} 多个字符串数组* @return {*} 创建完的字符串指针* @attention 需要调用delString()手动释放ptr*/
static char* newString(int num, ...)
{char *arg = NULL;va_list ap;int length = 0;va_start(ap, num);for (int i = 0; i < num; i++) {arg = va_arg(ap, char*);length += strlen(arg);}// va_end(ap);char* ptr = (char*)calloc(length+1, sizeof(char));if (ptr != NULL) {va_start(ap, num);for (int i = 0; i < num; i++) {arg = va_arg(ap, char*);strcat(ptr, arg);}va_end(ap);}else {printf("malloc failed\r\n");}return ptr;
}/*** @description: 释放一维指针的内存* @param {p} 一维指针* @return {*} 无*/
static void delString(char* p)
{free(p);p = NULL;
}/*** @description: 释放二维指针的内存* @param {p} 二维指针* @param {n} 第一维的数量* @return {*} 无* @attention 使用本函数可释放调用split()函数后的二维指针的内存*/
static void delArray(Array_t p, int n)
{for(int i=0; i<n; i++) {free(*(p+i));}free(p);p = NULL;
}/*** @description: 分割字符串* @param {buff} 待分割的字符串指针* @param {separator} 分隔符* @param {result} 分割后的字符串数组* @return {*} 分割后的字符串数组的第一维的数量* @attention 会改变原字符串,需要调用delArray()手动释放result*/
static int split(char* buff, char* separator, Array_t* result)
{int max = 4;int index = 0;*result = (Array_t)calloc(max, sizeof(char*));char *token;/* 获取第一个子字符串 */token = strtok(buff, separator);/* 继续获取其他的子字符串 */while( token != NULL ) {// printf( "%s\n", token);if(index == max) {max *= 2;*result = (Array_t)realloc(*result, max*sizeof(char*));if(*result == NULL) {printf("realloc failed\r\n");return 0;}else {// printf("realloc success\r\n");}}*(*result+index) = (char*)calloc(strlen(token)+1, sizeof(char));strcpy(*(*result+index), token);index ++;token = strtok(NULL, separator);}return index;
}/*** @description: 分割字符串* @param {buff} 待分割的字符串指针* @param {separator} 分隔符* @param {result} 分割后的字符串数组* @return {*} 分割后的字符串数组的第一维的数量* @attention 不会改变原字符串,需要调用delArray()手动释放result*/
static int splitExtra(char* buff, char* separator, Array_t* result)
{int max = 4;int index = 0;char *prev = buff;char *token;*result = (Array_t)calloc(max, sizeof(char*));/* 获取第一个子字符串 */token = strstr(buff, separator);/* 继续获取其他的子字符串 */while( token != NULL ) {// printf( "%s\n", token);if(index == max) {max *= 2;*result = (Array_t)realloc(*result, max*sizeof(char*));if(*result == NULL) {printf("realloc failed\r\n");return 0;}else {// printf("realloc success\r\n");}}*(*result+index) = (char*)calloc(token-prev+1, sizeof(char));if (*(*result+index) == NULL) {printf("calloc failed\r\n");}memcpy(*(*result+index), prev, token-prev);prev = token+strlen(separator);index ++;token = strstr(prev, separator);}/* 将最后部分加入 */if(index == max) {max += 1;*result = (Array_t)realloc(*result, max*sizeof(char*));if(*result == NULL) {printf("realloc failed\r\n");return 0;}else {// printf("realloc success\r\n");}}int remain = strlen(buff)-(prev-buff);*(*result+index) = (char*)calloc(remain+1, sizeof(char));if (*(*result+index) == NULL) {printf("calloc failed\r\n");}memcpy(*(*result+index), prev, remain);index ++;return index;
}/*** @description: 字符串大写* @param {ptr} 原字符串* @return {*} 大写后得字符串* @attention 会改变原字符串*/
static char* toUpper(char* ptr)
{char *orign = ptr;for (; *ptr != '\0'; ptr++) {*ptr = toupper(*ptr);}return orign;
}/*** @description: 字符串小写* @param {ptr} 原字符串* @return {*} 小写后得字符串* @attention 会改变原字符串*/
static char* toLower(char* ptr)
{char *orign = ptr;for (; *ptr != '\0'; ptr++) {*ptr = tolower(*ptr);}return orign;
}/*** @description: 是否以指定子字符串开头* @param {src} 待比较的字符串* @param {str} 指定的子字符串* @return {*} true/false*/
static Bool startWith(char* src, char* str)
{if (strlen(src) < strlen(str)) {return false;}for (int i = 0; i < strlen(str); i++) {if (src[i] != str[i]) {return false;}}return true;
}/*** @description: 是否以指定子字符串结尾* @param {src} 待比较的字符串* @param {str} 指定的子字符串* @return {*} true/false*/
static Bool endWith(char* src, char* str)
{if (strlen(src) < strlen(str)) {return false;}char* ptr = src+(strlen(src)-strlen(str));for (int i = 0; i < strlen(str); i++) {if (ptr[i] != str[i]) {return false;}}return true;
}/*** @description: 将字符串数组合并为一个字符串* @param {ptr} 字符串数组* @param {n} 数组第一维的数量* @return {*} 合并后的字符串* @attention 需要调用delString()手动释放buff*/
static char* join(Array_t ptr, int n)
{int length = 0;for (int i = 0; i < n; i++) {length += strlen(*(ptr+i));}char* buff = NULL;buff = (char*)calloc(length+1, sizeof(char));if (buff){for (int i = 0; i < n; i++) {strcat(buff, *(ptr+i));}}return buff;
}/*** @description: 移除字符串中指定的子字符串* @param {ptr} 原字符串指针* @param {ptr} 指定的子字符串指针* @return {*} 移除后的字符串指针,会改变原字符串*/
static char* strip(char* ptr, char* separator)
{Array_t res_arr;int cnt = splitExtra(ptr, separator, &res_arr);char* res_str = join(res_arr, cnt);strcpy(ptr, res_str);delArray(res_arr, cnt);delString(res_str);return ptr;
}void stringUtilTest()
{String str = StringUtil.newString(2, "ab", "cd");printf("1. new String (abc): %s\r\n", str);str = StringUtil.add(str, ",e,f,g,h");printf("2. add String (,e,f,g,h): %s\r\n", str);Array_t res;int cnt = StringUtil.splitExtra(str, ",", &res);printf("3. split String: ");for (int i = 0; i < cnt; i++) {printf("[%d]: %s  ", i, res[i]);}printf("\r\n");StringUtil.toUpper(str);printf("4. upper String: %s\r\n", str);StringUtil.toLower(str);printf("5. lower String: %s\r\n", str);Bool check = StringUtil.startWith(str, "abc");printf("6. startWith (abc): %d\r\n", check);check = StringUtil.endWith(str, ",h");printf("7. endWith (,h): %d\r\n", check);String joinstr = StringUtil.join(res, cnt);printf("8. join String: %s\r\n", joinstr);StringUtil.strip(str, ",");printf("9. strip String: %s\r\n", str);StringUtil.delString(joinstr);StringUtil.delArray(res, cnt);StringUtil.delString(str);
}

C语言实现String字符串及其函数相关推荐

  1. c语言中有裁剪字符串的函数吗,C语言中的字符串截取函数

    /*======================================================== 子数整数 源程序名 num.??? (pas,c,cpp) 可执行文件名 num. ...

  2. C++语言中反转字符串的函数strrev(), reverse()

    原文章地址:C++语言中反转字符串的函数strrev(), reverse() ,作者:王陸 (侵删) 1.使用string.h中的strrev函数 1 #include<stdio.h> ...

  3. c语言sub函数是什么,C语言中的字符串截取函数

    C语言中的字符串截取函数及应用 /*======================================================== 子数整数 源程序名 num.??? (pas,c, ...

  4. C语言的常用字符串操作函数(一)

    一直做的是单片机相关的程序设计,所以程序设计上更偏向底层,对于字符串的操作也仅限于液晶屏幕上的显示等工作,想提高下字符串操作的水平,而不是笨拙的数组替换等方式,翻看帖子发现C语言的字符串操作函数竟然这 ...

  5. access string 字符串处理函数Mid(), Left(), inStr

    Mid 函数 返回 Variant (String) 值,该值包含某个字符串中指定数目的字符. 语法 Mid(string, start[, length]) Mid 函数语法具有下面这些命名参数: ...

  6. C语言——数组、字符串处理函数、strlen、strcpy和strncpy、strcat和strncat、strcmp和strncmp

    目录 一.数组 1.定义:类型 数组名[元素个数] 2.数组不能动态定义 3.如何访问数组中的元素:数组名[下标] 4.循环与数组的关系 5.数组的初始化 二.C99标准中的数组 三.字符串处理函数 ...

  7. c语言中格式化字符串系列函数包括,解析C语言中常用的格式化输入、输出函数...

    fprintf(格式化输出数据至文件) 这个函数的功能类似于文件操作函数 fwrite();通过一个文件描述符将数据写入该文件描述符所指向的文件中. 函数定义: int fprintf(FILE * ...

  8. c语言 怎么将字符串代入函数,通过函数名字符串调用函数【C语言版】

    问题引入 在C中,函数先定义,后使用.举个简单的例子 /************************ * add by oscar999 ************************/ fun ...

  9. C语言中常用字符串处理函数(总结大全)

    目录 字符串处理函数 1.char *gets(char *s); 2. char *fgets(char *s, intsize, FILE *stream); 3. int puts(const ...

  10. c语言常用的字符串处理函数

    char *str="abc",就是常量,只能用,不能改. char str1[4],可以进行更改. 输入------------------------------------- ...

最新文章

  1. JavaScript 日期格式化 简单有用
  2. 阿里云服务器如何加强服务器的安全?有哪些安全措施?
  3. 的 while循环_十八、Python图解while循环
  4. Springboot+Maven在IDEA中配置好Maven后执行Reimport时提示:com.google.inject.internal.Errors.throwCreationExceptio
  5. OpenCASCADE:形状愈合之概述
  6. 请大家说一说:有没有必要针对VSS备份过程,做成一个开源小工具?
  7. linkedin上看到的CRM团队信息
  8. scala apply方法 笔记
  9. 影响力-你为什么说是
  10. windows API 第13篇 MoveFileEx
  11. 更换Homebrew为中科大源
  12. 枚举与常量需要注意的一个问题
  13. 微信/抖音商城小程序源码开源版(下载)
  14. ubuntu常用功能安装集锦
  15. k8s 1.23.1部署gitlab、 gitlab-runn配置k8s集群编写.gitlab-ci.yml实现根据tag,分支发布CICD流程
  16. 服务器信号切换机,KH1508Ai-远程KVM多电脑切换器-南京明高——MOXA工业互联网全系列产品销售服务平台 工业交换机,串口服务器,工业无线,嵌入式计算机,现场总线网关,接口转换器...
  17. linux复制后权限变化,学霸Linux基础命令吐血总结,给你当新华字典用
  18. C语言-字符0、数字0和‘\0’的区别
  19. 马斯克疯狂理念在中国落地?国产高速飞行列车即将登场
  20. 汇编语言---指令格式和基本语法

热门文章

  1. mcafee迈克菲官网由于验证缺陷,导致暴力破解到企业授权号获取到所有企业用户的Grant number
  2. 掌上百度2011java_掌上百度2011通用版 掌上百度 Java空间版
  3. 数据挖掘:概念与技术(第三版)之第八章的学习记录
  4. i4助手linux,爱思i4助手刷机教程
  5. python无人驾驶技术_智能汽车无人驾驶资料调研(一)
  6. json字符生成Java实体类--用好bejson
  7. 西门子plc电源开关如何选型
  8. 微信小游戏 H5 排行榜源码
  9. 如何对接GN EDI系统?
  10. 《HTTP权威指南》思维导图一览全书