C语言模拟String对象类型

来源:互联网 发布:linux 终端输入中文 编辑:程序博客网 时间:2024/06/02 06:38

用C语言模拟Java等面向对象语言中的String对象。

#include <stdio.h>#include <malloc.h>typedef struct{char* ch;int length;}String;#define TRUE 1#define FALSE 0#define OVERFLOW -1#define null '\0'void InitString(String* str);int CreateString(String* str,const char* chars);void PrintString(const String* str);void PrintlnString(const String* str);int StringLength(const String* str);int StringEmpty(const String* str);int Compare(const String* str1,const String* str2);void Clear(String* str);int Concat(String* str,const String* str1,const String* str2);int SubString(const String* str,int pos,int len,String* sub_str);char CharAt(const String* str,int pos);int Index(const String* str,const String* sub,int pos);int Contains(const String* str,const String* sub);int FirstIndexOf(const String* str,char ch);int LastIndexOf(const String* str,char ch);char SetCharAt(String* str,int pos,char newChar);char ReplaceFirst(String* str,char newChar);char ReplaceLast(String* str,char newChar);int ReplaceAll(String* str,char oldChar,char newChar);void ToUpperCase(String* str);void ToLowerCase(String* str);int StartWith(const String* str,const char* chars);int EndWith(const String* str,const char* chars);int GetCharsLength(const char* chars);void InitString(String* str){str->ch=NULL;str->length=0;}int CreateString(String* str,const char* chars){int len=GetCharsLength(chars);InitString(str);if(len>0){char* pStr;if(!(str->ch=(char*)malloc(len*sizeof(char))))return OVERFLOW;pStr=str->ch;while(*chars!='\0')/* Copy values */{*pStr++ = *chars++;}str->length=len;}return len;}void PrintString(const String* str){int i=0;char *p=str->ch;if(!str->length)printf("null");else{while(i<str->length){printf("%c",*p++);i++;}}}void PrintlnString(const String* str){int i=0;char *p=str->ch;if(!str->length)printf("null\n");else{while(i<str->length){printf("%c",*p++);i++;}printf("\n");}}int StringLength(const String* str){return str->length;}int StringEmpty(const String* str){if(str->ch)/* Exists */return FALSE;//Not emptyreturn TRUE;//Empty}/* Equal return 0,more than return 1,otherwise return -1 */int Compare(const String* str1,const String* str2){int i=0;for(;i<str1->length && i<str2->length;){if(str1->ch[i]!=str2->ch[i])/* Not equal */return str1->ch[i]==str2->ch[i]?0:str1->ch>str2->ch?1:-1;i++;}return str1->length==str2->length?0:str1->length>str2->length?1:-1;}void Clear(String* str){if(str->ch)//Dispose memory{free(str->ch);str->ch=NULL;}str->length=0;}int Concat(String* str,const String* str1,const String* str2){char *pStr,*pStr1,*pStr2;int i;InitString(str);if(!(str->ch=(char*)malloc((str1->length+str2->length)*sizeof(char))))return OVERFLOW;str->length=str1->length+str2->length;pStr=str->ch;pStr1=str1->ch;pStr2=str2->ch;for(i=0;i<str1->length;i++)/* Copy characters from str1 */*pStr++ = *pStr1++;for(i=0;i<str2->length;i++)/* Copy characters from str2 */*pStr++ = *pStr2++;return str->length;}int SubString(const String* str,int pos,int len,String* sub_str){int i=0;if(pos<0 || len<0)return FALSE;if(!(sub_str->ch=(char*)malloc(len*sizeof(char))))return OVERFLOW;sub_str->length=len;while(i<len)/* Copy */{sub_str->ch[i++]=str->ch[pos++];}return TRUE;}char CharAt(const String* str,int pos){return str->ch[pos];}int Index(const String* str,const String* sub,int pos){int i;int limit=str->length-sub->length+1;/* Last chance can match */String temp;if(pos<0 || pos>limit)/* Not valid position */return -1;i=pos;while(i<limit){SubString(str,i,sub->length,&temp);if(Compare(&temp,sub)==0)/* Matches */return i;i++;}return -1;}int Contains(const String* str,const String* sub){if(Index(str,sub,0)!=-1)/* Found */return TRUE;return FALSE;}int FirstIndexOf(const String* str,char ch){int i=0;while(i<str->length){if(str->ch[i]==ch)return i;i++;}return -1;}int LastIndexOf(const String* str,char ch){int i=str->length-1;while(i>0){if(str->ch[i]==ch)return i;i--;}return -1;}char SetCharAt(String* str,int pos,char newChar){char oldChar=str->ch[pos];str->ch[pos]=newChar;return oldChar;}char ReplaceFirst(String* str,char newChar){char oldChar;if(0==str->length)/* Empty string */return null;oldChar=str->ch[0];/* Fetch old value of first char */str->ch[0]=newChar;/* Set new value */return oldChar;}char ReplaceLast(String* str,char newChar){char oldChar;if(0==str->length)/* Empty string */return null;oldChar=str->ch[str->length-1];/* Fetch old value of last char */str->ch[str->length-1]=newChar;/* Set new value */return oldChar;}int ReplaceAll(String* str,char oldChar,char newChar){int i=0;int count=0;while(i<str->length){if(str->ch[i]==oldChar){str->ch[i]=newChar;count++;}i++;}return count;/* Return count of replaced char */}void ToUpperCase(String* str){int i=0;while(i<str->length){if(str->ch[i]>='a' && str->ch[i]<='z')str->ch[i]-=32;/* Converts to capital */i++;}}void ToLowerCase(String* str){int i=0;while(i<str->length){if(str->ch[i]>='A' && str->ch[i]<='Z')str->ch[i]+=32;/* Converts to lower case */i++;}}int StartWith(const String* str,const char* chars){int i=0;while(*chars!='\0'){if(str->ch[i++] != *chars++)return FALSE;}return TRUE;}int EndWith(const String* str,const char* chars){int i=str->length-GetCharsLength(chars);while(*chars!='\0')/* chars not end */{if(str->ch[i++] != *chars++)/* Not equal */return FALSE;}return TRUE;}int GetCharsLength(const char* chars){int len=0;while(*chars!='\0')/* Not '\0' */{++len;++chars;}return len;}int main(){String str,sub_str,concat_str;CreateString(&str,"Yannis");printf("String: ");PrintlnString(&str);printf("String Length: %d\n",StringLength(&str));printf("String Empty: %d (true:1,false:0)\n",StringEmpty(&str));printf("Substring from 1 to 4: ");if(SubString(&str,1,4,&sub_str))PrintlnString(&sub_str);printf("\"Yannis\" contains \"anni\": %d\n",Contains(&str,&sub_str));printf("Index of sub-string \"anni\": %d (brute force method)\n",Index(&str,&sub_str,0));printf("Concat \"Yannis\" and \"anni\": ");Concat(&concat_str,&str,&sub_str);PrintlnString(&concat_str);printf("Clear concated string: ");Clear(&concat_str);PrintlnString(&concat_str);printf("Compare: \"Yannis\" with \"anni\"(EQ=0,LT<0,MT>0): %d\n",Compare(&str,&sub_str));printf("Fetch char: %c\n",CharAt(&str,1));printf("First index of 'n': %d\n",FirstIndexOf(&str,'n'));printf("Last index of 'n': %d\n",LastIndexOf(&str,'n'));printf("SetCharAt 5: (old:%c,new:%c): ",SetCharAt(&str,5,'o'),'o');PrintlnString(&str);printf("ReplaceFirst: (old:%c,new:%c): ",ReplaceFirst(&str,'w'),'w');PrintlnString(&str);printf("ReplaceLast: (old:%c,new:%c): ",ReplaceLast(&str,'s'),'s');PrintlnString(&str);printf("ReplaceAll: (old:%c,new:%c),%d characters placed: ",'n','t',ReplaceAll(&str,'n','t'));PrintlnString(&str);printf("ToUpperCase: ");ToUpperCase(&str);PrintlnString(&str);printf("ToLowerCase: ");ToLowerCase(&str);PrintlnString(&str);printf("Start with \"wat\": %d\n",StartWith(&str,"wat"));printf("End with \"is\": %d\n",EndWith(&str,"is"));    return 0;}

注:注释不全,算法待改进~~~

0 0
原创粉丝点击