串的操作及其应用

rabbit342 2010-11-11 10:55:23
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
#define MaxSize 60
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define NULL 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef struct
{
ElementType data[MaxSize];
int length;// 串长度
}SqString;

void StrAssign(SqString &S,char str[]) //串赋值
{
int i=0;
for(i=0;str[i]!='\0';i++)
S.data[i]=str[i];
S.length=i+1;
}

int StrCompare(SqString &S,SqString &T)//若S>T,则返回值>0;若S=T,则返回值=0;否则返回值<0
{
int i;
for(i=0;i<S.length&&i<T.length;i++)
if(S.data[i]!=T.data[i])
return (S.data[i]-T.data[i]);
return (S.length-T.length);
}

int StrLength(SqString &S) /*返回串的长度*/
{
int i;
for(i=0;(S.data[i])!='\0';i++);
S.length=i;
return S.length;
}

Status Concat(SqString &S,SqString &S1,SqString &S2)//用S返回由串S1和S2联结而成的新串,若未截断,则返回TRUE,否则返回FALSE
{
int i;
if (S1.length+S2.length<=MaxSize)//未截断
{
for(i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=S1.length+S2.length;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return TRUE;
}
else if(S1.length<=MaxSize)//截断S2
{
for (i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return FALSE;
}
else//截断S1,或仅取S1
{
for(i=0;i<MaxSize;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
return FALSE;
}
}

Status SubString(SqString &Sub, SqString &S, int pos, int len)
//用Sub返回串S的第pos个字符起长度为len的子串。其中,1<=pos<=StrLength(S) 且 0<=len<=StrLength(S) -pos + 1 。
{
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return ERROR;
for(i=pos-1;i<pos+len;i++)
Sub.data[i]=S.data[i];
Sub.length=len;
return OK;
}

Status StrEmpty(SqString &S)//若S为空串,则返回TRUE,否则返回FALSE
{
if(S.length==0)
return TRUE;
else
return FALSE;
}

Status StrCopy(SqString &S,SqString &T) /*由串T复制得串S,若未截断,则返回TRUE,否则返回FALSE*/
{
int i;
if(T.length<=MaxSize)
{
for(i=0;i<T.length;i++)/*将串T的字符赋值给串S*/
S.data[i]=T.data[i];
S.length=T.length; /*将串S的长度赋值给串T*/
return TRUE;
}
else
{
for(i=0;i<MaxSize;i++)
S.data[i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
}

Status StrInsert(SqString &S,int pos,SqString &T)//在串S的第pos个字符之前插入串T
{
int i;
if(pos<1||pos>S.length+1)
return ERROR;//pos不合法
if(S.length+T.length<=MaxSize)
{
for(i=S.length+T.length-1;i>=pos-1+T.length;i--)
S.data[i]=S.data[i-T.length];
for(i=0;i<T.length;i++)
S.data[pos-1+i]=T.data[i];
S.length=S.length+T.length;
return TRUE;
}
else if(pos-1+T.length<=MaxSize)
{
for(i=MaxSize-1;i>pos+T.length-1;i--)
S.data[i]=S.data[i-T.length];
for(i=0;i<T.length;i++)
S.data[pos-1+i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
else
{
for(i=0;i<MaxSize-pos+1;i++)
S.data[pos-1+i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
}

Status StrDelete(SqString &S,int pos,int len)/*从串S中删除第pos个字符起长度为len的子串*/
{
int i;
if(pos<0||len<0||pos+len-1>S.length)
return FALSE;
else
{
for(i=pos+len;i<=S.length-1;i++)
S.data[i-len]=S.data[i];
S.length=S.length-len;
return TRUE;
}
}

void StrClear(SqString &S) /*清空串,只需要将串的长度置为0即可*/
{
S.length=0;
}

int Index(SqString &S,SqString &T,int pos)//若主串S中存在和串T相等的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则返回0
{
int n,m,i;
SqString Sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
for(i=0;i<=n-m+1;i++)
{
SubString(Sub,S,i,m);
if(StrCompare(Sub,T)!=0);
else
return i;
}
}
return FALSE;
}

void DispStr(SqString &S)//打印操作
{
int i;
if (S.length>0)
{
for(i=0;i<S.length;i++)
printf("%c",S.data[i]);
printf("\n");
}
}

Status Replace(SqString &S,SqString &T,SqString &V)//用V替换主串S中出现的所有与T相等的不重叠的子串
{
int i; //从串S的第一个字符起查找串T
if(StrEmpty(T)==NULL) // T是空串
return ERROR;
for(i=1;;i+=StrLength(V))
{
i=Index(S,T,i); // i为从上一个i之后找到的子串T的位置
if(i) // 串S中存在串T
{
StrDelete(S,i,StrLength(T)); // 删除该串T
StrInsert(S,i,V); // 在原串T的位置插入串V
}
}
return OK;
}

void C(SqString &S)
{
char str[MaxSize];
printf("请输入要赋值的字符串:");
gets(str);
getchar();
StrAssign(S,str);
}

void I(SqString &S)
{
int pos;
SqString T;
printf("请输入要插入的起始位置:");
scanf("%d",&pos);
printf("\n");
printf("请输入要插入的字符串:");
gets(T.data);
StrInsert(S,pos,T);
}

void D(SqString &S)
{
int pos,len;
printf("请输入要删除的起始位置:");
scanf("%d",&pos);
printf("\n");
printf("请输入删除长度:");
scanf("%d",&len);
StrDelete(S,pos,len);
}

void R(SqString &S)
{
int pos,len;
SqString T,V;
printf("请输入要置换的起始位置:");
scanf("%d",&pos);printf("\n");
printf("请输入置换长度:");
scanf("%d",&len);
printf("\n");
SubString(T, S, pos,len);
printf("请输入将要换入的字符串:");
gets(V.data);
Replace(S,T,V);
}

void main()
{
char c1;
SqString S;
int i=1;
while(i==1)
{
printf("输入C: 表示要求根据用户输入的以回车为结束符的字符串建立顺序串\n");
printf("输入I:表示要求输入,然后输入插入的起始位置和要插入的字符串\n");
printf("输入D:表示要求删除,然后输入删除的起始位置和删除长度\n");
printf("输入R:表示要求置换,然后输入置换的起始位置、置换长度和将要换入的字符串\n");
printf("输入E:结束串编辑\n");
printf("请选择要实现的功能\n");
c1=getchar();
getchar();
switch(c1)
{
case'C':C(S);
case'I':I(S);
case'D':D(S);
case'R':R(S);
case'E':exit(0);
default:printf("error\n");
}
printf("还进行编辑吗?Y OR N?:");
printf("\n");
c1=getchar();
if(c1=='Y'||c1=='y')
i=1;
else
i=0;
}
printf("该串为:");
DispStr(S);
printf("\n");
}

编译没错,但是就是运行有问题,可以帮忙找出什么问题么?
...全文
376 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouthy734850796 2010-12-02
  • 打赏
  • 举报
回复
if (S1.length+S2.length<=MaxSize)
else if(S1.length<=MaxSize)
这两个条件并不互斥,怎能用并列IF语句
porschev 2010-12-01
  • 打赏
  • 举报
回复
太长了。。。
jikeyuan1 2010-11-29
  • 打赏
  • 举报
回复
受不了啦 又是这么长的代码啊
A137750489 2010-11-29
  • 打赏
  • 举报
回复
此处高手云集,小弟不敢发言
rabbit342 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhouthy734850796 的回复:]

我的意思是说,如果你调用Concat(SqString &S,SqString &S1,SqString &S2)时,S1,S2都小于MaxSize时,它会执行哪一句?
[/Quote]
你到底懂不懂我的意思吖?如果分别跟MAXSIZE比较就没有意义啦,我要两个的长度之和小于等于MAXSIZE才行吖~~
zhouthy734850796 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhouthy734850796 的回复:]

if (S1.length+S2.length<=MaxSize)//未截断
{
for(i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=S1.length+S2.length;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return TRUE;
}
el……
[/Quote]不如把else if(S1.length<=MaxSize),换else if(S1.length<=MaxSize && S2.length>MaxSize)
zhouthy734850796 2010-11-25
  • 打赏
  • 举报
回复
我的意思是说,如果你调用Concat(SqString &S,SqString &S1,SqString &S2)时,S1,S2都小于MaxSize时,它会执行哪一句?
rabbit342 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhouthy734850796 的回复:]

if成立的话,这个程序它也会执行else if的,因为条件满足嘛。这样程序执行完IF,返回TRUE,还要执行ELSE IF,返FALS
[/Quote]
if成立的话已经return TRUE,不会再执行else if的了
zhouthy734850796 2010-11-24
  • 打赏
  • 举报
回复
if成立的话,这个程序它也会执行else if的,因为条件满足嘛。这样程序执行完IF,返回TRUE,还要执行ELSE IF,返FALS
zhouthy734850796 2010-11-24
  • 打赏
  • 举报
回复
这两句话有冲突,既然它们和小于MAXSIZE,那么S1也肯定小于MAXSIZE,你让程序执行哪一句呢
这样,结果既返回FALSE,也返回TRUE,程序当然晕啦。

rabbit342 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhouthy734850796 的回复:]

if (S1.length+S2.length<=MaxSize)//未截断
{
for(i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=S1.length+S2.length;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return TRUE;
}
el……
[/Quote]晕,if成立的话,它不会执行else if的啦~~而且第二个表示只取部分S2,S1是全保留的
rabbit342 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhouthy734850796 的回复:]

这么长的代码,理解,偶需要时间,顶一下
[/Quote]
thx~~~
zhouthy734850796 2010-11-23
  • 打赏
  • 举报
回复
if (S1.length+S2.length<=MaxSize)//未截断
{
for(i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=S1.length+S2.length;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return TRUE;
}
else if(S1.length<=MaxSize)//截断S2
{
for (i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return FALSE;
}

这两句话有冲突,既然它们和小于MAXSIZE,那么S1也肯定小于MAXSIZE,你让程序执行哪一句呢
zhouthy734850796 2010-11-22
  • 打赏
  • 举报
回复
这么长的代码,理解,偶需要时间,顶一下
rabbit342 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhzxlc_06 的回复:]

mark了
有空帮你看看
[/Quote]谢啦~~
chaoliu1024 2010-11-21
  • 打赏
  • 举报
回复
mark了
有空帮你看看
rabbit342 2010-11-12
  • 打赏
  • 举报
回复
不好意思,补充一下上述代码的作用:

实验内容
⒈问题描述:本题目中的串编辑要求对串实现以下三种功能:
⑴插入:把一个字符串插入到给定串的指定位置
⑵删除:将串中某指定位置开始的若干字符从串中删除
⑶置换:用一串字符置换给定串中某指定位置开始的若干字符
⒉基本要求
输入要求:首先输入功能标志符,表明要求实现何种功能,然后再输入有关数据
输入C, 表示要求根据用户输入的以回车为结束符的字符串建立顺序串
输入I,表示要求输入;然后输入插入的起始位置和要插入的字符串
输入D,表示要求删除;然后输入删除的起始位置和删除长度
输入R,表示要求置换 ;然后输入置换的起始位置、置换长度和将要换入的字符串
输入E,结束串编辑。
熊熊大叔 2010-11-11
  • 打赏
  • 举报
回复
贴这么长的代码,也不说程序是干什么用的,也不说有什么问题。
就一句有问题,真当别人都闲得没事。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧