标签:
简单的实现串的操作,其实这与那些字符串库函数所用的操作思想是相同的,但是这是一种数据的存储方式,与操作,重点强调了数据的存储.
下面是串的非堆存储操作,说明白就是穿类似数组的存储,在分配内存时在栈中分配:
/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: str.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 25 5 * **********************************************************************/ #pragma once #include<iostream> using namespace std; #include<assert.h> #define MAX_STR_LEN 20 typedef char SString[MAX_STR_LEN+2];//首元素放串的长度,再给'\0'空间 //1.生成一个值为s的串ss bool StrAssign(SString ss,char *s); //2.复制串s得到串ss bool StrCopy(SString ss,SString s); //一.字符串拷贝,返回新字符串的首地址 char *my_strcpy(char *d, const char *str); //3.判空 bool StrEmpty(SString ss); //4.比较字符串 int StrCompare(SString ss,SString s); //二.字符串比较 size_t my_strcmp(const char *d,const char *str); //5.求串长度 size_t StrLength(SString ss); //三.求字符串长度(在使用返回值时可以强制类型转换将无符号转换为有符号进行运算) size_t my_strlen(const char *str); //6.把字符串s1和s2联接成新串ss bool Concat(SString ss,SString s1,SString s2); //四.字符串连接,返回新串的首地址 char *my_strcat(char *d,const char *str); //7. 返回串ss从pos位置起长度为len的子串并用数组sub保存 bool SubString(SString sub,SString ss,size_t pos,size_t len); //8.返回从ss串pos位置开始与c串有相同的子串出现的位置(只返回第一次出现的相同子串) size_t Index(SString ss,SString c,size_t pos); //9.用串v替换ss串中和c串相等的子串 bool Replace (SString ss,SString c,SString v); //10.在串ss的第pos个字符前面插入串c bool StrInsert(SString ss,size_t pos,SString c); //11.删除串ss中第pos个字符开始长度为len 的字符串 bool StrDelete(SString ss,size_t pos,size_t len); //12.销毁删除串ss bool DestoryString(SString ss); //13.显示串 void StrPrint(SString ss);
/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: str.cpp * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 25 5 * **********************************************************************/ #include"str.h" //1.生成一个值为s的串ss bool StrAssign(SString ss,char *s) { assert(strlen(s)<=MAX_STR_LEN);//超过就放不下 ss[0]=strlen(s);//字符串长度放在首元素 for(int i=1;i<=ss[0];++i) { ss[i]=s[i-1]; } ss[ss[0]+1]='\0';//保证有字符串的'\0'标识 return true; } //2.复制串s得到串ss bool StrCopy(SString ss,SString s) { //assert(ss[0]>s[0]);没必要判断,因为初始化的时候已经判断了 for(int i=0;i<=s[0];++i) { ss[i]=s[i]; } ss[ss[0]+1]='\0';//保证有字符串的'\0'标识 return true; } //一.字符串拷贝,返回新字符串的首地址 char *my_strcpy(char *d, const char *str); //3.判空 bool StrEmpty(SString ss) { return ss[0]==0; } //4.比较字符串 int StrCompare(SString ss,SString s) { int i=1; for(;i<=ss[0]&&i<=s[0];++i) { if(ss[i] != s[i]) { return ss[i]-s[i]; } } if(i>ss[0] || i>s[0])//两个串长度不相等时候 { return ss[i]-s[i]; } return ss[0]-s[0];//两个串相等的时候 } //二.字符串比较 size_t my_strcmp(const char *d,const char *str); //5.求串长度 size_t StrLength(SString ss) { return ss[0]; } //三.求字符串长度(在使用返回值时可以强制类型转换将无符号转换为有符号进行运算) size_t my_strlen(const char *str); //6.把字符串s1和s2联接成新串ss bool Concat(SString ss,SString s1,SString s2) { if(s1[0]+s2[0]<=MAX_STR_LEN) { ss[0]=s1[0]+s2[0]; for(int i=1;i<=s1[0];++i) { ss[i]=s1[i]; } for(int j=1;j<=s2[0];++j) { ss[s1[0]+j]=s2[j]; } } else//超过后,放入s1截断s2或者s2无机会放入 { ss[0]=MAX_STR_LEN; for(int i=1;i<=MAX_STR_LEN;++i) { ss[i]=s1[i]; if(s1[0]< MAX_STR_LEN) { ss[s1[0]+1]=s2[i]; } } } ss[s1[0]+s2[0]+1]='\0';//保证有字符串的'\0'标识 return true; } //四.字符串连接,返回新串的首地址 char *my_strcat(char *d,const char *str); //7. 返回串ss从pos位置起长度为len的子串并用数组sub保存 bool SubString(SString sub,SString ss,size_t pos,size_t len) { if(pos<1 || pos>ss[0] ||len<1|| len > ss[0]-pos+1)//当pos=0时候就直接输出数原字符串 //长度与位置关系应考虑到加一 { return false; } sub[0]=len; for(int i=0;i<len;++i) { sub[i+1]=ss[pos+i]; } return true; } //8.返回从ss串pos位置开始与c串有相同的子串出现的位置(只返回第一次出现的相同子串) size_t Index(SString ss,SString c,size_t pos) { assert( pos <=ss[0] && c[0] <=ss[0] ); int i=pos; int j=1; while(i<=ss[0] && j<=c[0]) { if(ss[i]==c[j]) { i++; j++; } else { i=i-j+2; //从串ss的下一个字符开始比较 j=1; //串c又从开头开始进行比较 } } if(j>c[0])//说明比较完毕 { return i-c[0];//返回c字符串在ss中首元素出现的位置 } return 0;//没找到 } //9.用串v替换ss串中和c串相等的子串 bool Replace (SString ss,SString c,SString v) { return true; } //10.在串ss的第pos个字符前面插入串c bool StrInsert(SString ss,size_t pos,SString c) { for(int i=ss[0]+1;i>=pos;--i)//往后移动时,连'\0'一块进行移动 { int a=c[0]; if(ss[0]+ c[0] > MAX_STR_LEN) { a=MAX_STR_LEN-ss[0]; } ss[i+a]= ss[i]; } int j=0,r=ss[0]; while( j<=c[0] ) { if(ss[0]+ c[0] > MAX_STR_LEN) { if(r<MAX_STR_LEN)//c串部分插入 { r++; } else { break; } } ss[pos+j]=c[j+1]; //c串全部插入 j++; } if(ss[0]+ c[0]<=MAX_STR_LEN)//确定插入后串的长度 { ss[0]+=c[0]; } else { ss[0]=MAX_STR_LEN; } return true; } //11.删除串ss中第pos个字符开始长度为len 的字符串 bool StrDelete(SString ss,size_t pos,size_t len) { if(pos<1 || pos>ss[0]-len +1|| len<1) return false; for(int i=pos+len;i<=ss[0];i++) ss[i-len]=ss[i]; ss[0]-=len; return true; } //12.销毁删除串ss bool DestoryString(SString ss) { ss[0]=0; return true; } //13.显示串 void StrPrint(SString ss) { for(int i=1;i<=ss[0];++i) { cout<<ss[i]<<" "; } cout<<"\n"; }
/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: main.cpp * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 25 5 * **********************************************************************/ //测试函数 #include"str.h" int main() { SString s1; char a1[]="123456"; StrAssign(s1, a1); cout<<"s1 is: "; StrPrint(s1); cout<<"\n"; SString s2; char a2[]="123456789900009900"; StrAssign(s2, a2); cout<<"s2 is: "; StrPrint(s2); cout<<"\n"; cout<<"After Insert:"; StrInsert(s1,2,s2); StrPrint(s1); cout<<"\n"; cout<<"After Delete:"; StrDelete(s1,3,4); StrPrint(s1); cout<<"\n"; /* cout<<Index(s1, s2, 4)<<"\n"; //substring 函数测试 SString sub; SubString(sub,s1,1, 3); cout<<"sub is: "; StrPrint(sub); cout<<"\n"; //连接测试 SString ss; Concat(ss,s1,s2); cout<<"After concat ss is: "; StrPrint(ss); cout<<"\n"; //复制测试 StrCopy(s1,s2); cout<<"After copy s1 is: "; StrPrint(s1); cout<<"\n"; //比较测试 cout<<"result of compare s1 with s2 is : "; if(StrCompare(s1,s2)!= 0) { if(StrCompare(s1,s2) > 0) cout<<"s1 大 \n"; else cout<<"s2 大 \n"; } else { cout<<"相等 \n"; }*/ return 0; }
待续:串的堆存储操作》》》》》》》》》》》》》
标签:
原文地址:http://blog.csdn.net/kai8wei/article/details/46246383