头文件如下:
#ifndef mystring_h
#define mystring_h
#include <stdio.h>
typedef struct CString{
char *point;
int length;
} mystring;
/*******************字符串初始化**********************/
/**初始化一个空的字符串*/
void init(mystring *string);
/**初始化一个length长度的空字符串*/
void initwithlength(mystring *string ,int length);
/**初始化copystring字符串*/
void initwithstring(mystring *string, char *copystring);
/**打印字符串*/
void printfstring(mystring *string);
/*******************字符串插入**********************/
/**在末尾插入一个字符*/
void addCharWithEnd(mystring *string,char ch);
/**在末尾插入一个字符串*/
void addStringWithEnd(mystring *string , char *addString);
/**在指定位置插入一个字符*/
void addChar(mystring *string ,char ch,char *pos);
/**在指定位置插入一个字符串**/
void addString(mystring *string ,char* str,char *pos);
/*******************字符串查找**********************/
char * findfirstchar(mystring *string, char findchar);
char * findfirststring(mystring *string, char* substr);
/*******************字符串删除**********************/
int deletesubchar(mystring *string, char subchar);
int deletesubstring(mystring *string, char* substr);
/*******************字符串修改**********************/
void modifyFirstChar(mystring *string,const char oldchar,const char newchar);
void modifyFirstString(mystring *string,char* const oldstr,char* const newstr);
/*******************字符串逆转**********************/
void reverseString(mystring *string);
/*******************字符串大小写转换**********************/
void toUpper(mystring *string);
void toLowwer(mystring *string);
/*******************字符串比较**********************/
int compare(mystring *str1,mystring *str2);
/*******************字符串转整数**********************/
int zp_atoi(mystring *string);
#endif /* mystring_h */
.c文件
#include "mystring.h"
#include <stdlib.h>
#include <string.h>
/**比较两个字符串的大小**/
int mystrcmp(const char *str1,const char * str2){
if (str1 == NULL || str2 == NULL) return -1;
while (*str1 && str2 && *str1 == *str2){
str1++;
str2++;
}
/*如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest < source ,则返回值小于0。*/
return *str1 - *str2;
}
/***在串中查找指定字符串的第一次出现位置***/
char * mystrstr(const char *src,const char *sub){
if(src==NULL||NULL==sub) return NULL;
const char *psrc=src;
const char *psub=sub;
while(*src)
{
psrc=src;
psub=sub;
do{
if(*sub == '\0')
return src;
}while(*src++==*psub++);
src+=1;
}
return NULL;
}
/***在串中查找指定字符的第一次出现位置***/
char *mystrchr(const char *dest,const char ch){
if (dest == NULL) return NULL;
while (*dest != '\0') {
if (*dest == ch) {
return dest;
}
dest ++;
}
return NULL;
}
/***字符串拼接函数**/
char * mystrcat(char *dest,const char *src){
if (dest == NULL || src == NULL) return NULL;
char *p = dest;//存储字符串首地址
while (*dest != '\0') {
dest++;
}
while ((*dest++ = *src++) && *src != '\0') ;
*dest = '\0';
return p;
}
/***字符串拷贝函数**/
char * mystrcpy(char *dest,const char *src){
if (dest == NULL || src == NULL) return NULL;
char *p = dest;//存储字符串首地址
while ((*dest++ = *src++) && *src != '\0');
*dest = '\0';
return p;
}
/***获取字符串长度**/
int mystrlen(const char *p){
if (p == NULL) {
return -1;
}
int length = 0;
while (*p != '\0') {
length ++;
p ++;
}
return length;
}
/**********我****是****分****割****线**********/
void init(mystring *string){
string->point = NULL;
string->length = 0;
}
void initwithlength(mystring *string ,int length){
string->point = (char *)calloc(length, sizeof(char));
string->length = length;
}
void initwithstring(mystring *string, char *copystring){
int length = mystrlen(copystring);
string->point = (char *)calloc(length+1, sizeof(char));
mystrcpy(string->point, copystring);
string->length = length +1;
}
void printfstring(mystring *string){
printf("\n%s\r\n",string->point);
}
/*******************字符串插入**********************/
/**插入一个字符*/
void addCharWithEnd(mystring *string,char ch){
//如果长度已经满了
if(mystrlen(string->point) + 1 == string->length){
string->point = realloc(string->point, string->length + 1);
string->length +=1;
string->point[string->length-1] = '\0';
string->point[string->length-2] = ch;
}else{
int length = mystrlen(string->point);
string->point[length] = ch;
string->point[length + 1] = '\0';
}
}
/**插入一个字符串*/
void addStringwithend(mystring *string , char *addString){
int length = mystrlen(string->point);
int nowLength = mystrlen(addString);
//如果超出长度,需要重新分配内存空间
if (length + nowLength + 1 > string->length) {
string->point = (char *)realloc(string->point, length + nowLength + 1);
string->length = length +nowLength + 1;
mystrcat(string->point, addString);
}else{
mystrcat(string->point, addString);
}
}
/**在指定位置插入一个字符*/
void addChar(mystring *string ,char ch,char *pos){
if (string == NULL || pos == NULL) {
return;
}
//如果超出长度,需要重新分配内存空间
if (mystrlen(string->point) + 1 == string->length) {
string->point = (char *)realloc(string->point, string->length+1);
string->length +=1;
int length = mystrlen(string->point);
int moveLength = mystrlen(pos);//需要移动的长度
//考虑到'\0',所以从length处开始遍历
for (int i=length; i>length-moveLength; i--) {
string->point[i] = string->point[i-1];
}
//插入字符
string->point[length-moveLength] = ch;
//插入'\0'
string->point[length+1] = '\0';
}else{
int length = mystrlen(string->point);
int moveLength = mystrlen(pos);//需要移动的长度
//考虑到'\0',所以从length处开始遍历
for (int i=length; i>length-moveLength; i--) {
string->point[i] = string->point[i-1];
}
//插入字符
string->point[length-moveLength] = ch;
//插入'\0'
string->point[length+1] = '\0';
}
}
/**在指定位置插入一个字符串*/
void addString(mystring *string ,char* str,char *pos){
if(string == NULL || pos == NULL || str== NULL){
return;
}
int nowLength = mystrlen(string->point);
int addLength = mystrlen(str);
int moveLength = mystrlen(pos);
//如果超出长度需要重新分配存储空间
if (nowLength + addLength + 1 > string->length) {
string->point = (char *)realloc(string->point, nowLength + addLength + 1);
string->length = nowLength + addLength + 1;
int moveLength = mystrlen(pos);
int lenth = mystrlen(string->point);
int i= addLength + nowLength - 1;
for (; i>lenth-moveLength; i--) {
string->point[i] = string->point[i - addLength];
}
//插入字符
while (*str) {
string->point[i] = *str;
str++;
i++;
}
//插入空字符
string->point[string->length - 1] = '\0';
}else{
int i = nowLength + addLength -1;
for (; i>nowLength-moveLength; i--) {
string->point[i] = string->point[i-addLength];
}
//插入字符
while (*str) {
string->point[i] = *str;
str++;
i++;
}
//插入空字符
string->point[string->length - 1] = '\0';
}
}
/*******************字符串查找**********************/
char * findfirstchar(mystring *string, char findchar){
char *p = mystrchr(string->point, findchar);
return p;
}
char * findfirststring(mystring *string, char *subStr){
char *p = mystrstr(string->point, subStr);
return p;
}
/*******************字符串删除**********************/
int deletesubchar(mystring *string, char subchar){
char *p = findfirstchar(string, subchar);
if (p == NULL) {
return 0;
}
char *pNext = p+1;
while (*pNext!='\0'){
*p++ = *pNext++;
}
*p = '\0';
return 1;
}
int deletesubstring(mystring *string, char* substr){
char *p = findfirststring(string, substr);
if (p == NULL) {
return 0;
}else{
//获取要删除的字符串长度
int length = mystrlen(substr);
char *pNext = p + length;
while (*pNext != '\0') {
*p++ = *pNext++;
}
*p = '\0';
return 1;
}
}
/*******************字符串修改**********************/
/**替换遇到的第一个字符*/
void modifyFirstChar(mystring *string,const char oldchar,const char newchar){
if (string == NULL) return;
char *p = string->point;
while (*p) {
if (*p == oldchar) {
*p = newchar;
break;
}
p++;
}
}
/**替换遇到的第一个字符串*/
void modifyFirstString(mystring *string,char* const oldstr,char* const newstr){
if(string == NULL) return;
char *pfind = findfirststring(string, oldstr);
if (pfind == NULL) return;
//删除遇到的第一个字符串
deletesubstring(string, oldstr);
//插入新的字符串
addString(string, newstr, pfind);
}
/***字符串反转**/
void reverseString(mystring *string){
if(string == NULL) return;
int length = mystrlen(string->point);
char *p = string->point;
for (int i=0; i<length/2; i++) {
char tem = p[i];
p[i] = p[length - 1 -i];
p[length - 1 -i] = tem;
}
}
/*******************字符串大小写转换**********************/
void toUpper(mystring *string){
if(string== NULL) return;
char *p = string->point;
while (*p) {
if (*p >= 'a' && *p <= 'z') {
*p = *p -32;//大写A = 65 小写a = 97;
}
p++;
}
}
void toLowwer(mystring *string){
if(string == NULL) return;
char *p = string->point;
while (*p) {
if (*p>='A' && *p<='Z') {
*p = *p +32;
}
p++;
}
}
/***字符串比较***/
int compare(mystring *str1,mystring *str2){
if (str1 == NULL || str2 == NULL) return -1;
char *p1 = str1->point;
char *p2 = str2->point;
return mystrcmp(p1, p2);
}
/*******************字符串转整数**********************/
int zp_atoi(mystring *string){
if (string == NULL) {
return 2147483647;//直接返回异常值
}
int res =0;
char *p = string->point;
//如果等于空字符
while (*p&& *p==' ') {
p++;
}
int isMinus = 1;//-1表示是负数,1表示是正数,默认是正数
if(*p == '+' || *p=='-'){
if (*p == '-') {
isMinus = -1;
}
p++;
}
char *px = p;//保存首地址;
while (*p) {
if (*p < '0' || *p > '9') {
return 2147483647;//直接返回异常数据
}
p++;
}
while (*px) {
res = res *10 + *px - '0';
px++;
}
return res * isMinus;
}
网友评论