字符串封装

Posted luoxuw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串封装相关的知识,希望对你有一定的参考价值。

1、main 调用自定义字符串函数,只需要include “MyString.h”即可

#include "myString.h"    
void main()
   // myString *str; 这个语句错了,我现在是要创建一个myString的结构体变量,而不是结构体指针!!!!
   myString str;
   initString(&str);
   initWithLength(&str,5);
   initWithString(&str,"China is great");
  // addCharAtEnd(&str,‘!‘);
   //addStrAtEnd(&str,"luoxu");
   //deleteFirstChar(&str,‘i‘);
   deleteFirstStr(&str,"is ");
   printString(&str);
   // initWithLength(str,10);
   

 2、myString.h //自定义字符串函数声明

//
// Created by luoxu on 8/10/2019.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct CString
    char *p;   //first address of a string
    int length;  //the length of that string
;
typedef struct CString myString;

//declare self-defined functions about myString
void initString(myString *str );
void initWithLength(myString *str, int len);
void initWithString(myString *str, const char *cpyStr);
void addCharAtEnd(myString *str, char ch);
void deleteFirstChar(myString *str, char ch);
void addStrAtEnd(myString *str, char *addStr);
void deleteFirstStr(myString *str, char *delStr);
void addChar(myString *str, char ch, char pos);  //add ch after pos    
void addStr(myString *str, char *addStr, char pos);  //add string after pos
void printString(myString *str);

 3、realizeMyString.c  自定义函数实现

//
// Created by luoxu on 8/10/2019.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "myString.h"

void initString(myString *str )
    str->p =NULL;
    str->length =0;


void initWithLength(myString *str, int len)
    //str->p = (char *)calloc(len+1, sizeof(char));
    str->p = (char *)calloc(len+1, sizeof(char)); //allocate space with initializing 0
    //str->length = len +1; //do not plus 1 with length, because ‘\0‘ is not included,but plus 1 is needed while allocating space like the statement above
    str->length = len;


/*void initWithString(myString *str1, char *str2 )   //str1和str2根本不属于同一个等级
    //用这种方式定义会更好 void initWithString(myString *str, char *cpyStr )
    str1->p = (char *) calloc(strlen(str2)+1, sizeof(char));  // plus 1 is needed while allocating space
    strcpy(str1->p,str2);   //strcpy(str1,str2);这是我犯的错误
    str1->length = strlen(str2);
*/
void initWithString(myString *str, const  char *cpyStr )
    str->p = (char *) calloc(strlen(cpyStr)+1, sizeof(char));  // plus 1 is needed while allocating space
    strcpy(str->p,cpyStr);
    str->length = strlen(cpyStr);


void addCharAtEnd(myString *str, char ch)
    if(strlen(str->p)+1 == str->length)  //此时就意味着str->p的空间不够了,需要重新分配
        str->p =(char *) realloc(str->p,strlen(str->p)+2);
        *((str->p) + (str->length)) = ch;  //assign last second char
        *((str->p) + (str->length)+1) = ‘\0‘;  //assign last char
        str->length++;
    else
       //下标法
        str->p[str->length] =ch;
        str->p[str->length+1] =‘\0‘;
    

void deleteFirstChar(myString *str, char ch)
    char * p = str->p;
    while (*(str->p)!= ‘\0‘)
        if(*(str->p) == ch)
            for (char *px = str->p ; px+1 < p+ str->length; ++px) 
                *(px) = *(px+1);
            
            break ;
        
        str->p++;
    
    str->p = p;
    str->length--;

void addStrAtEnd(myString *str, char *addStr)
    if(strlen(str->p)+strlen(addStr)+1 > str->length)
        strcat(str->p,addStr);
        str->length += strlen(addStr);
     else
        strcat(str->p,addStr);
    


void deleteFirstStr(myString *str, char * delStr)
    char *p = strstr(str->p,delStr);
    char *cpStart =p + strlen(delStr);   //cp every char from here
    if(*cpStart == ‘\0‘)  //if cpStart is already at End, then end the string
        *p = ‘\0‘;   //end    the string
     else
        while (*cpStart != ‘\0‘)
            *p = *cpStart;
            p++;
            cpStart++;
        
        *p = ‘\0‘;  //if(*cpStart == ‘\0‘) them end the string

    


void printString(myString *str)
    printf("print string:%s\n",str->p);
    printf("print len:%d\n",str->length);

 

以上是关于字符串封装的主要内容,如果未能解决你的问题,请参考以下文章

如何快速封装Jquery小组件?例如去掉字符串中的所有空格,封装和使用都比较简单

如何快速封装Jquery小组件?例如去掉字符串中的所有空格,封装和使用都比较简单

c++ 常用字符串封装函数

字符串封装

封装字符串以忽略引号

Sring StringBuffer StringBuilder封装类