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