代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
字符串的操作
作者:
小原周
/ 发布于
2015/8/3
/
1083
对字符串的封装,实现字符串的各种常用操作方法的实现:如strcpy、strlen等库函数的实现
string.h ?#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //字符串的封装 需要库函数也可以完全不需要库函数 typedef struct CString { char *p;//保存字符串首地址 int realLength;//字符串实际长度 }mystring; void init(mystring*string);//原封不动初始化 void initWithLength(mystring*string,int length);//开辟长度 内存清0 void initWithString(mystring*string,char*copystring);//初始化字符串 并拷贝 //显示字符串 void showString(mystring*string); //实现库函数 获取字符串长度 int mystrlen(char*p); //字符串拷贝 char *mystrcpy(char*dest, const char*source); char*mystrcat(char*dest, const char*source); //增加 插入 字符、字符串 void backAddChar(mystring*string, char ch); void backAddString(mystring*string, char*str); //内部字符串当做指令来处理 void run(mystring*string); //查找字符串中第一个找到的字符 strchr char*findFirstChar(mystring*string, char ch); char*mystrchr(const char*dest, const char ch); //查找字符串 strstr char*findFirstString(mystring*string, char*str); char*mystrstr(const char*dest, const char*findstr); //删除字符、字符串 int deleteFirstChar(mystring*string,const char ch); int deleteFirstString(mystring*string, char*const str); //任意位置增加(字符、字符串) 根据地址 void addChar(mystring *string, char ch, char *pos); void addString(mystring*string, char *str, char*pos); //任意位置修改(字符、字符串) 根据地址 void changeFirstChar(mystring*string, const char oldchar, const char newchar); void changeFirstString(mystring*string, char*const poldstr, char*const pnewstr); string.c #include "string.h" //初始化 void init(mystring*string) { string->p = NULL; string->realLength = 0; } void initWithLength(mystring*string, int length)//开辟长度 内存清0 { string->p = (char*)calloc(length,sizeof(char));//分配内存并清0 string->realLength = length; } void initWithString(mystring*string, char*copystring)//初始化字符串 并拷贝 { if (NULL==string) { printf("字符串为空,无法拷贝\n"); return 0; } int length = strlen(copystring);//获取字符串长度 string->p = (char*)calloc(length + 1, sizeof(char));//由于此处的calloc已经全部初始化为0 所以下面的操作不需要考虑字符串结束标志 //strcpy(string->p, copystring);//拷贝字符串 mystrcpy(string->p, copystring); string->realLength = length + 1;//设置长度 } //显示字符串 void showString(mystring*string) { printf("showString = %s\n", string->p); } //获取字符串长度 int mystrlen(char*p) { int length = 0; if (NULL==p) { printf("字符串为空\n"); return 0; } while (*p != '\0') { length++; p++; } return length; } //字符串拷贝 char *mystrcpy(char*dest, const char*source) { if (NULL==dest&&NULL==source) { printf("字符串为空\n"); return NULL; } char *destbak = dest; while (*source!='\0') { *dest = *source;//字符赋值 source++; dest++;//指针前移 } *dest = '\0'; return destbak;//返回地址 } char*mystrcat(char*dest, const char*source) { if (!dest||!source) { printf("字符串为空,插入失败\n"); return NULL; } else { char*destbak = dest;//保留地址 while ((*destbak++) != '\0');//指针前移 while ((*dest++) != '\0')//循环并拷贝字符串 { *dest= *source; dest++; source++; } *dest = '\0'; return destbak; } } //内部字符串当做指令来处理 void run(mystring*string) { system(string->p);//执行指令 } //查找字符串中第一个找到的字符 strchr char*findFirstChar(mystring*string, char ch) { char*p = mystrchr(string->p, ch);//使用自定义函数 return p; } char*mystrchr(const char*dest, const char ch) { if (NULL==dest) { return NULL; } while (*dest++!='\0') { if (*dest==ch) { return dest;//找到 就返回地址 } } return NULL;//没找到返回NULL } //查找字符串 strstr char*findFirstString(mystring*string, char*str)//返回第一个找到的字符串地址 { char*pres = mystrstr(string->p, str); return pres;//返回找到字符串的地址 } char*mystrstr(const char*const dest, const char*const findstr)//避免传递过来的字符串以及地址被随便修改 { //判断为空 很重要 if (NULL==dest||NULL==findstr) { return NULL; } char*destbak = dest; char*p = NULL;//保存找到的字符串地址 while (*destbak!='\0' ) { int flag = 1; char*findstrbak = findstr; char*nowdestbak = destbak; while (*findstrbak!='\0') { if (*nowdestbak != '\0') { if (*findstrbak++ != *nowdestbak++) { flag = 0;//不等 } } else { flag = 0; break; } } if (1==flag) { p = destbak; return p; } destbak++; } return NULL; } //删除字符、字符串 int deleteFirstChar(mystring*string, const char ch) { //查找 char*pstr = mystrchr(string->p, ch); if (NULL==pstr) { return 0; } char*pnext = pstr + 1; //双指针循环 while (*pnext!='\0') { *pstr++ = *pnext++;//ok } *pstr = '\0'; return 1; } int deleteFirstString(mystring*string, char*const str) { char*pres = mystrstr(string->p, str); if (NULL==pres) { return 0; } else { int length = mystrlen(str);//字符串长度 char*pnext = pres + length; while (*pnext!='\0') { *pres++ = *pnext++; } *pres = '\0';//字符串结尾结束标志 return 1; } } //尾部增加 字符、字符串 void backAddChar(mystring*string, char ch) { if (strlen(string->p) + 1 == string->realLength) { //重新分配内存 string->p = realloc(string->p, string->realLength + 1); string->realLength += 1; string->p[string->realLength - 2] = ch; string->p[string->realLength - 1] = '\0'; } else { int nowlength = mystrlen(string->p);//求出当前长度 string->p[nowlength] = ch; string->p[nowlength + 1] = '\0'; } } void backAddString(mystring*string, char*str) { int nowmyStringLength = mystrlen(string->p);//获取当前字符串长度 int addStringLength = mystrlen(str);//要增加字符串的长度 if (nowmyStringLength + addStringLength + 1 > string->realLength) { int needAddLength = nowmyStringLength + addStringLength + 1 - string->realLength; //分配内存 string->p = (char*)realloc(string->p, string->realLength + needAddLength);//增加字符串长度 mystrcat(string->p, str);//字符串拼接 string->realLength += needAddLength;//增加长度 } else { mystrcat(string->p, str);//拼接字符串 } } //任意位置增加(字符、字符串) 根据地址 void addChar(mystring *string, char ch, char *pos) { if (NULL == pos||NULL==string) { return NULL; } if (mystrlen(string->p)+1==string->realLength) { //重新分配内存 string->p = realloc(string->p, string->realLength + 1); string->realLength += 1; int nowlength = mystrlen(string->p); int movelength = mystrlen(pos); for (int i= nowlength; i>nowlength-movelength; i--) { string->p[i] = string->p[i - 1]; } string->p[nowlength - movelength] = ch;//插入 } else { int nowlength = mystrlen(string->p);//求出当前长度 int movelength = mystrlen(pos);//求出现在要移动的长度 for (int i = nowlength; i > nowlength - movelength; i--) { string->p[i] = string->p[i - 1]; } string->p[nowlength - movelength] = ch; string->p[nowlength+1] = '\0'; } } void addString(mystring*string, char *str, char*pos) { if (NULL==pos||NULL==string) { return; } int nowmystringlength = mystrlen(string->p);//获取当前长度 int addstringlength = mystrlen(str);//要增加的字符串长度 if (nowmystringlength+addstringlength+1>string->realLength)//判断是否 { string->p = (char*)realloc(string->p, string->realLength + needaddlength); string->realLength += needaddlength;//增加长度 int nowlength = mystrlen(string->p);//求出当前的长度 int movelength = mystrlen(pos);//求出现在要移动的长度 int insertlength = mystrlen(str);//要求出插入的长度 for (int i = nowlength; i >=nowlength-movelength ;i++) { string->p[i + insertlength] = string->p[i];//字符移动 } for (int j = 0; j < insertlength;j++) { string->p[nowlength - movelength+j] = str[j];//赋值拷贝 } } else { int nowlength = mystrlen(string->p);//求出当前的长度 int movelength = mystrlen(pos);//求出现在要移动的长度 int insertlength = mystrlen(str);//要求出插入的长度 for (int i = nowlength; i >= nowlength - movelength; i++) { string->p[i + insertlength] = string->p[i];//字符移动 } for (int j = 0; j < insertlength; j++) { string->p[nowlength - movelength + j] = str[j];//赋值拷贝 } } } //任意位置修改(字符、字符串) 根据地址 void changeFirstChar(mystring*string, const char oldchar, const char newchar) { char *pstr = string->p; while (*pstr!='\0') { if (*pstr==oldchar) { *pstr = newchar; return;//如果套替换所有的字符 去掉return即可 } pstr++; } } void changeFirstString(mystring*string, char*const poldstr, char*const pnewstr) { char*pfind = findFirstString(string,poldstr); if (NULL!=pfind) { deleteFirstString(string, poldstr); addString(string, pnewstr, pfind); } } main.c ?#include "string.h" void main1() { mystring string1; //函数内部改变外部变量 需要地址 initWithString(&string1,"mynameisrocket"); showString(&string1); printf("字符串长度:%d\n", mystrlen(&string1)); getchar(); } void main2() { mystring string1; // initWithString(&string1, "cal"); // showString(&string1); // //增加字符 // backAddChar(&string1, 'c'); // run(&string1); //增加字符串 initWithString(&string1, "note"); showString(&string1); backAddString(&string1, "pad"); showString(&string1); run(&string1); getchar(); } //测试字符查找函数 strchr void main3() { mystring string1; initWithString(&string1, "calaaaa"); showString(&string1); //修改 将找到的一个字符a改为A char*pstr = findFirstChar(&string1, 'a'); *pstr = 'A'; showString(&string1); getchar(); } //测试strstr mystrstr void main4() { mystring string1; initWithString(&string1, "calaaaa"); showString(&string1); char *pstr = findFirstString(&string1, "laz"); // printf("查找:%s\n", *pstr);//error printf("查找:%s\n", pstr); if (pstr!=NULL) { *pstr = 'Z'; } showString(&string1); getchar(); } //删除(字符、字符串)依赖于查找 void main5() { mystring string1; initWithString(&string1, "abcdabcdaa"); showString(&string1); //删除第一个指定的字符 deleteFirstChar(&string1, 'b'); showString(&string1); //删除第一个指定的字符串 deleteFirstString(&string1, "abc"); showString(&string1); getchar(); } //测试增加字符 增加字符串 void main6() { mystring string1; initWithString(&string1, "note"); showString(&string1); backAddString(&string1, "abcd1234"); showString(&string1); char*p = findFirstChar(&string1, 'a'); if (NULL!=p) { addChar(&string1, 'Z', p); } showString(&string1); getchar(); } //任意位置修改字符 字符串 void main() { mystring string1; initWithString(&string1, "notepadnote"); showString(&string1); //changeFirstString(&string1, "note", "calc"); //替换所有符合条件的字符串 while (findFirstString(&string1,"note")) { changeFirstString(&string1, "note", "12345"); } showString(&string1); getchar(); }
试试其它关键字
字符串
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
小原周
贡献的其它代码
(
2
)
.
字符串的操作
.
多任务多线程任务管理类
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3