C++C语言C语言&嵌入式

C语言实现字符串

2018-01-24  本文已影响8人  Mark_Guan

头文件如下:

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

上一篇 下一篇

猜你喜欢

热点阅读