C语言实现字符串

作者: Mark_Guan | 来源:发表于2018-01-24 21:49 被阅读8次

头文件如下:

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

相关文章

  • 【Redis面试题】Redis的字符串是怎么实现的?

    Redis字符串的实现 Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的...

  • C++11新特性(20)-用string对象处理文件名

    C风格字符串 从C语言开始,就已经实现了对字符串的支持。为了处理C风格字符串,C语言标准库提供了一组函数,它们被定...

  • 从根儿上理解 Redis(一)

    简单动态字符串 Redis 底层使用 C 语言实现的,但是 Redis 没有直接使用 C 语言传统的字符串表示,而...

  • 39_字符串类的创建(上)

    关键词: 0. 历史遗留问题 C语言不支持真正意义上的字符串 C语言用字符数组和一组函数实现字符串操作 C语言不支...

  • redis源码2--字符串SDS

    Redis是用C语言实现的,但是并没有使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串...

  • C++中数组操作符的重载

    字符串类的兼容性 存在的一些历史遗留问题C语言不支持真正意义上的字符串C语言用字符数组和一组函数实现字符串操作C语...

  • Redis-第九章节-动态字符串

    目录 概述 SDS(动态字符串) SDS(动态字符串)与c语言字符串的区别 1、概述 String类型底层实现的简...

  • 百度笔试150题

    1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...

  • C语言- 字符、字符数组

    字符数组和字符串 C语言中没有字符串这种数据类型,C语言中通过char型数组来替代字符串的功能。C语言中的字符串一...

  • 2018-05-13

    C语言:c语言中没有字符串类型,也没有字符串变量,字符串是放在字符型数组中的。 C语言数变量类型:整型、浮点型、v...

网友评论

    本文标题:C语言实现字符串

    本文链接:https://www.haomeiwen.com/subject/nyspaxtx.html