程序设计的思想以及应该避免的错误都在代码中旁的注释中有标明,此程序适用于串的顺序(即普通的数组形式的创建)和堆创建,此外,此代码并不难,只是运用简单的数组的思想,希望对你有所帮助,最好,看明白后,自己别看,然后打出来,如果是照抄,希望最少抄两遍
//非常抱歉,由于程序在设计之初是本着开辟一个随机位置的数组进行编程的,但是在检验时发现此程序最大也就只能记录到127个字符,
//所以在程序中str类型的数组应该第一个都啥都没存,后期加了一个int型的数来存储,程序改了好几遍,不过不影响整体思维设计部分
//应该..应该这个版本是CSDN里堆顺序串最全的,但是依然有些许的小bug,但但....不出意外,你找不到我的bug,这个bug不影响程序运行
//但是对于空间有些许的浪费,时间不多,累了,有时间再来改
#include<iostream>//我发现个bug,捏码,数组怎么销毁,你能删除一个int型的数吗,这不是扯淡嘛,所以..我写的是主题是堆,但emmm.思想一样
#include<string.h>
#include<stdlib.h>
using namespace std;
#define MAX 255
typedef struct Str
{
//另外请注意,因为第一位存储的并不是字符而是字符串的长度,所以后边的很多地方需要向后一位!!!请注意
char *ch;
int len;//踏马的,忘了char也就只能存127这么大,擦擦擦擦擦擦,这牛马我不待改完,尼玛
//上边和下边其实没有什么区别,但利于销毁
//char ch[MAX+1];//若是用第一个位值的元素存储此串的长度,那么是肯定不必重新定义一个len的
//int len;
}Str;
void menu(void);
void caidancaozuo(Str& str);
void StrAssign(Str& str);//初始化一个串,并且在一个串中加入一串连续的值就是让用户随便的输入一串字符
void StrEmpty(Str str);//判断是否为空,是否存在,最简单了
void StrCopy(Str& str);//复制一个串
void Strcat(Str& str);//在第一个串后加入一个串
void Index(Str str);//检索到你想要查的某一个字符在此字符串中出现的地方,检索一串的emmm...下一个再写
void insert(Str& str);//插入一个字符
void Replace(Str& str);//替换一个字符
void Clear(Str& str);//清空字符串
void Destroy(Str& str);//销毁字符串
void OutPut(Str str);//输出整个字符串
void OutPutIndex(Str str);//输出你要从哪一个位置开始的后面的所有的字符串
void OutLen(Str str);//输出字符串的长度 非常之easy
int main(void)
{
Str str;
menu();
caidancaozuo(str);
}
void menu(void)
{ //我觉得我这个菜单写的不赖很经典,写前边了,哈哈哈哈哈
char a01[] = "(1)创建顺序串";
char a02[] = "(2)判断是否为空以及判断否存在";
char a03[] = "(3) 复制一个串";
char a04[] = "(4)第一个串后加入一个串(即追加,不过会这个,插入一段一定会) ";
char a05[] = "(5)查找某个字符在串中的位置";
char a06[] = "(6)插入一个字符";
char a07[] = "(7)替换一个字符";
char a08[] = "(8)清空字符串";
char a09[] = "(9)销毁字符串";
char a10[] = "(10)输出整个字符串";
char a11[] = "(11)输出你要从哪一个位置开始的后面的所有的字符串";
char a12[] = "(12)串的长度";
char a13[] = "输入入任意不在前面菜单的数字将结束程序";
printf("%-50s", a01);
printf("%-50s\n", a02);
printf("%-50s", a03);
printf("%-50s\n", a04);
printf("%-50s", a05);
printf("%-50s\n", a06);
printf("%-50s", a07);
printf("%-50s\n", a08);
printf("%-50s", a09);
printf("%-50s\n", a10);
printf("%-50s", a11);
printf("%-50s\n", a12);
printf("%-50s\n", a13);
}
void caidancaozuo(Str& str)//再次自我感觉良好觉得这个自我调用也不赖,放前边了
{
cout << "请问你想选择哪个指令" << endl;
int mingling;
cin >> mingling;
switch (mingling)
{
case 1:
{
StrAssign(str);
caidancaozuo(str);
break;
}
case 2:
{
StrEmpty(str);
caidancaozuo(str);
break;
}
case 3:
{
StrCopy(str);
caidancaozuo(str);
break;
}
case 4:
{
Strcat(str);
caidancaozuo(str);
break;
}
case 5:
{
Index(str);
caidancaozuo(str);
break;
}
case 6:
{
insert(str);
caidancaozuo(str);
break;
}
case 7:
{
Replace(str);
caidancaozuo(str);
break;
}
case 8:
{
Clear(str);
caidancaozuo(str);
break;
}
case 9:
{
Destroy(str);
caidancaozuo(str);
break;
}
case 10:
{
OutPut(str);
caidancaozuo(str);
break;
}
case 11:
OutPutIndex(str);
caidancaozuo(str);
break;
case 12:
OutLen(str);
caidancaozuo(str);
break;
default:
cout << "您已经决定退出此程序,程序即将退出" << endl;
break;
}
}
void StrAssign(Str& str)
{
//内个啥 内个你输入空格就退出了嗷,空格后边的不算
str.ch=(char*)malloc(sizeof(char)*(MAX+1));
str.len=0;//经实验得出结果s的值或许需设的特别大
cout<<"请输入一串字符(范围是1到254)"<<endl;//因为最后一位是要存储\0的 ,第一位是存储长度的,所以你懂的
char s[100000];
scanf("%s",s);
int i=1;
//cout<<str.ch[0]<<endl;
while(s[i-1]&&str.len<=(MAX-1))
{
str.ch[i]=s[i-1];
i++;
str.len+=1;
if(i==MAX)
{
cout<<"您输入的字符数已经超过了规定的最大的数值"<<endl;
break ;
}
}
str.ch[i]='\0';//我想给他在最后手动加一个\0
//经实验得出结果这个效果比较不错,哈哈哈哈哈哈
OutPut(str);
}
void StrEmpty(Str str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串是空的"<<endl;
return ;
}else{
//请注意下边的写法是错误的,请思考原因 但是强转一下还是可以滴
// cout<<"您的串不为空,它的长度是"<<str.ch[0]<<endl;
printf("您的串不为空,它的长度是%d\n",str.len);
return ;
}
}
void StrCopy(Str& str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0)//这个情况根据本程序的设计很难出现
{
cout<<"你的串长是0怎么给你复制啊"<<endl;
return ;
}else{
cout<<str.len<<endl;
//printf("您的串不为空,它的长度是%d\n",str.ch[0]);
}
cout<<"您要复制的串是:"<<endl;
OutPut(str);
Str strfuben;
strfuben.ch=(char*)malloc(sizeof(char)*(MAX+1));
strfuben.len=0;
int i=1;
while(str.ch[i])//思考一下吧
{
strfuben.ch[i]=str.ch[i];
i++;
strfuben.len=1;
}
strfuben.ch[i]='\0';//我想给他在最后手动加一个\0
cout<<"复制后输出的结果是:"<<endl;
OutPut(strfuben);
}
//这个函数有点意思哈
void Strcat(Str& str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
/*
此程序为在一个串后追加一个数组,我觉得就很简单啥的,但是哈,
结合插入函数和这个,其实稍微改一点你就可以实现在任意的位置插入啥的,非常的简单哈,自己去想*/
cout<<"请输入你要追加的串是什么"<<endl;
//其实这样也很没意思,那我直接在后面继续输入不得了,就是不新创建一个串了(but这个想法很低级,只是为了完成作业而已)
//为什么要创建还是有原因的,为啥?...自己想,而且这两种并无区别
if(str.len==(MAX-1))
{
cout<<"你这还加个der啊,第一个都超出范围了"<<endl;
return;
}
Str appstr;
StrAssign(appstr);
int x=str.len+appstr.len;
if(x<MAX-1)
{
cout<<"可以追加"<<endl;
int a=appstr.len;
int b=str.len;
int i=1;
while(appstr.ch[i])
{
str.ch[0]+=1;
str.ch[b+1]=appstr.ch[i];
b++;
i++;
}
str.ch[b+1]='\0';//这个有点意思,请仔细思考b、i啥的实际的增减啥的
}else{
cout<<"由于您的这个创建的串的总长度没有这么多,所以,只能追加一部分嗷"<<endl;
int a=appstr.len;
int b=str.len;
int i=1;
while(appstr.ch[i])
{
str.ch[0]+=1;
str.ch[b+1]=appstr.ch[i];
if(str.len==(MAX-1))
{
cout<<"追加的部分结束"<<endl;
break;
}
b++;
i++;
}
str.ch[MAX]='\0';//这个有点意思,请仔细思考b、i啥的实际的增减啥的
}
cout<<"追加后的串中的字符是:"<<endl;
OutPut(str);
}
void Index(Str str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串是空的"<<endl;
return ;
}
cout<<"请输入你想查询你要查询的字符是什么"<<endl;
char a;
cin>>a;
int b=0;//记录出现的次数
for(int i=1;str.ch[i]!='\0';i++)
{
if(str.ch[i]==a)
{
cout<<"您输入的"<<a<<"在此串中的第"<<i<<"个位置有出现"<<endl;
b++;
}
}
if(b==0)
{
cout<<"您的字符并未在串中出现"<<endl;
}else{
cout<<"你的字符在串中共出现了"<<b<<"次"<<endl;
}
}
//插入一个如此,插入一段字符串思想则是相同的,在for循环体中
void insert(Str& str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串是空的"<<endl;
return ;
}
cout<<"请输入你要在第几个元素后插入元素:";
int x;
cin>>x;
cout<<"请输入你要插入的字符是什么:";
char a;
cin>>a;
str.len++;//一是插入后本身肯定会加一,二是有个\0需要你注意
int q=str.len;
for(int i=q;i>x;i--)
{
str.ch[i+1]=str.ch[i];
}
str.ch[x+1]=a;
OutPut(str);
}
void Replace(Str& str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串是空的"<<endl;
return ;
}
cout<<"请输入你想在把第几个位置的字符给替换"<<endl;
int x;
cin>>x;
cout<<"请输入你想在把第"<<x<<"个位置的字符给替换为什么"<<endl;
char a;
cin>>a;
str.ch[x]=a;
}
void Clear(Str& str)
{if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串本身就是空的哈"<<endl;
return ;
}
cout<<"即将开始执行清除命令"<<endl;
str.len=0;
str.ch[1]='\0';//笑死,捏嘛,清除个der啊
cout<<"清除成功"<<endl;
}
void Destroy(Str& str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
cout<<"即将执行销毁命令"<<endl;
str.len=0;
free(str.ch);
//cout<<str.ch[2]<<endl;利用此方式进行销毁
str.ch=NULL;
cout<<"销毁命令已被执行"<<endl;
}
void OutPut(Str str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串是空的"<<endl;
return ;
}
int i=1;
//因为我在他的后边主动加了\0,哈哈哈哈哈哈
cout<<"您的串的字符是:";
while(str.ch[i])
{
cout<<str.ch[i];
i++;
}
cout<<endl;
}
void OutPutIndex(Str str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
if(str.len==0){
cout<<"您的串是空的"<<endl;
return ;
}
cout<<"请问你要从第几个字符开始输出"<<endl;
int x;
cin>>x;
int a=str.len;//!!!
if(x<0||x>a)
{
cout<<"请输入在1至"<<a<<"个数字范围内的数字"<<endl;
return ;
}else{
int i=x;
//请自己好好分析下i和x的赋值原因
while(str.ch[i])
{
cout<<str.ch[i];
i++;
}
cout<<endl;
}
}
void OutLen(Str str)
{
if(str.ch==NULL)
{
cout<<"您未创建一个串,请先创建一个串"<<endl;
return;
}
//记住不可使用下边的这种输出方式,看一下正确的写法,自己想想
//另外此种版本的写法,可以说几乎完全不符合逻辑,写一写锻炼下逻辑就够了
//cout<<"您的串中共有"<<str.ch[0]<<"个字符"<<endl;
cout<<"您的字符串中共有"<<str.len<<"个字符"<<endl;
}
|