C语言数据结构里顺序串的问题
以下的程序是顺序串的操作:
无错误,可为何执行的时候出错(屏幕上什么也没有)
请高手帮忙,哪里出错?要解释。。。。
谢谢
#include "stdio.h"
#include "stdlib.h"
#define MAXLEN 100
typedef struct
{
char ch[MAXLEN];
int Len;
}SString;
void StrAsign (SString *S,char *chars)
{
int i=0;
while(chars[i]!='0')
{
S->ch[i]=chars[i];
i++;
}
S->Len=i;
}
void StrCopy(SString *S,SString *T)
{
int i;
for(i=0;i<T->Len;i++)
S->ch[i]=T->ch[i];
S->Len=T->Len;
}
int StrLength(SString *S)
{
return(S->Len);
}
int StrCat(SString *S,SString *T)
{
int i,flag;
if (S->Len+T->Len<=MAXLEN)
{
for(i=S->Len;i<S->Len+T->Len;i++)
S->Len+=T->Len;
flag=1;
}
else if (S->Len<MAXLEN)
{
for(i=S->Len;i<MAXLEN;i++)
S->ch[i]=T->ch[i-S->Len];
S->Len=MAXLEN;
flag=0;
}
else
flag=0;
return(flag);
}
int SubString(SString *Sub,SString *S,int pos,int len)
{
int j;
if(pos<1||pos>S->Len||len<1||len>S->Len-pos+1)
{
Sub->Len=0;
printf("参数错误!");
return 0;
}
else
{
for(j=0;j<len;j++)
Sub->ch[j]=S->ch[pos+j-1];
Sub->Len=len;
return 1;
}
}
int StrIndex(SString *S,SString *T)
{
int i=0,j=0,k;
while(i<S->Len&&j<T->Len)
{
if (S->ch[i]==T->ch[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=T->Len)
k=i-T->Len+1;
else
k=-1;
return k;
}
void DispStr(SString *S)
{
int i;
for(i=0;i<S->Len;i++)
printf("%c",S->ch[i]);
}
void main()
{
SString S,T,R,Sub;
int Length,pos,len,loc;
StrAsign(&S,"abcdefgdeg");
printf("\n串S为:");
DispStr(&S);
Length=StrLength(&S);
printf("\n串S的长度为%d",Length);
StrAsign(&T,"deg");
printf("串T为\n");
DispStr(&T);
printf("\n将串T复制给串R,复制后的结果串R为:");
StrCopy(&R,&T);
DispStr(&R);
if(StrCat(&S,&T))
{
printf("\n串S与串T连接后的串S为:");
DispStr(&S);
Length=StrLength(&S);
printf("\n串S的长度为%d:",Length);
}
else
printf("\n串S与串T的连接为成功!");
printf("\n请输入要截取串S的其实位置与截取的长度值分别为:");
scanf("%d %d",&pos,&len);
printf("将串S从第%d个字符开始,将长度为%d的字符序列复制到串Sub中",pos,len);
if(SubString(&Sub,&S,pos,len))
{
printf("\n串Sub为:");
DispStr(&Sub);
Length=StrLength(&Sub);
printf("\n串Sub的长度为%d:",Length);
}
loc=StrIndex(&S,&T);
if(loc==-1)
printf("\n串S与串T匹配失败!");
else
printf("\n串S与串T匹配!匹配位置为%d:",loc);
}
[解决办法]
//可以运行,后一部分没有检查。#include "stdio.h"#include "stdlib.h"#define MAXLEN 100typedef struct{char ch[MAXLEN];int Len;}SString;void StrAsign (SString *S,char *chars){int i=0;while(chars[i]!='\0')//here{S->ch[i]=chars[i];i++;}S->ch[i]='\0';//hereS->Len=i;}void StrCopy(SString *S,SString *T){int i;for(i=0;i<T->Len;i++)S->ch[i]=T->ch[i];S->Len=T->Len;}int StrLength(SString *S){return(S->Len);}int StrCat(SString *S,SString *T){int i,j=0,flag;if (S->Len+T->Len<=MAXLEN){for(i=S->Len;i<S->Len+T->Len;i++)S->ch[i]=T->ch[j++];//这里是连接S->ch[i]='\0';S->Len+=T->Len;flag=1;}else if (S->Len<MAXLEN){for(i=S->Len;i<MAXLEN;i++)S->ch[i]=T->ch[i-S->Len];S->Len=MAXLEN;flag=0;}elseflag=0;return(flag);}int SubString(SString *Sub,SString *S,int pos,int len){int j;if(pos<1||pos>S->Len||len<1||len>S->Len-pos+1){Sub->Len=0;printf("参数错误!");return 0;}else{for(j=0;j<len;j++)Sub->ch[j]=S->ch[pos+j-1];Sub->Len=len;return 1;}}int StrIndex(SString *S,SString *T){int i=0,j=0,k;while(i<S->Len&&j<T->Len){if (S->ch[i]==T->ch[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j>=T->Len)k=i-T->Len+1;elsek=-1;return k;}void DispStr(SString *S){int i;for(i=0;i<S->Len;i++)printf("%c",S->ch[i]);}void main(){SString S,T,R,Sub;int Length,pos,len,loc;StrAsign(&S,"abcdefgdeg");printf("\n串S为:");DispStr(&S);Length=StrLength(&S);printf("\n串S的长度为%d",Length);StrAsign(&T,"deg");printf("串T为\n");DispStr(&T);printf("\n将串T复制给串R,复制后的结果串R为:");StrCopy(&R,&T);DispStr(&R);if(StrCat(&S,&T)){printf("\n串S与串T连接后的串S为:");DispStr(&S);Length=StrLength(&S);printf("\n串S的长度为%d:",Length);}elseprintf("\n串S与串T的连接为成功!");printf("\n请输入要截取串S的其实位置与截取的长度值分别为:");scanf("%d %d",&pos,&len);printf("将串S从第%d个字符开始,将长度为%d的字符序列复制到串Sub中",pos,len);if(SubString(&Sub,&S,pos,len)){printf("\n串Sub为:");DispStr(&Sub);Length=StrLength(&Sub);printf("\n串Sub的长度为%d:",Length);}loc=StrIndex(&S,&T);if(loc==-1)printf("\n串S与串T匹配失败!");elseprintf("\n串S与串T匹配!匹配位置为%d:",loc);}
[解决办法]
#include "stdio.h"#include "stdlib.h"#define MAXLEN 100typedef struct{ char ch[MAXLEN]; int Len;} SString;void StrAsign (SString *S,char *chars){ int i=0; while( chars[i] != '\0') /*字符串的结束标志是\0*/ { S->ch[i] = chars[i]; i++; } S->Len = i;}void StrCopy(SString *S,SString *T ){ int i; for( i=0; i<T->Len; i++ ) S->ch[i] = T->ch[i]; S->Len = T->Len;}int StrLength(SString *S){ return( S->Len );}int StrCat(SString *S,SString *T){ int i,flag,j; if ( S->Len+T->Len <= MAXLEN ) { for( i=S->Len,j=0; j<T->Len; i++,j++ ) /*在这里做些改动,你应该把T中的字符赋给S的后面*/ S->ch[i] = T->ch[j]; S->Len += T->Len; /*两个长度的总和*/ flag=1; } else if (S->Len<MAXLEN) { for(i=S->Len;i<MAXLEN;i++) S->ch[i]=T->ch[i-S->Len]; S->Len=MAXLEN; flag=0; } else flag=0; return( flag );}int SubString(SString *Sub,SString *S,int pos,int len){int j;if(pos<1||pos>S->Len||len<1||len>S->Len-pos+1){Sub->Len=0;printf("参数错误!");return 0;}else{for(j=0;j<len;j++)Sub->ch[j]=S->ch[pos+j-1];Sub->Len=len;return 1;}}int StrIndex(SString *S,SString *T){ int i=0,j=0,k; while(i<S->Len&&j<T->Len) { if ( S->ch[i] == T->ch[j] ) { i++; j++; } else { i=i-j+1; j=0; } } if(j >= T->Len ) k=i-T->Len+1; else k=-1; return k;}void DispStr( SString *S ){ int i; for(i=0;i<S->Len;i++) printf("%c",S->ch[i]);}void main(){ SString S,T,R,Sub; int Length,pos,len,loc; StrAsign(&S,"abcdefgdeg"); printf("\n串S为:"); DispStr(&S); Length=StrLength(&S); printf("\n串S的长度为%d",Length); StrAsign(&T,"deg"); printf("串T为\n"); DispStr(&T); printf("\n将串T复制给串R,复制后的结果串R为:"); StrCopy(&R,&T); DispStr(&R); if ( StrCat( &S, &T ) ) { printf("\n串S与串T连接后的串S为:"); DispStr(&S); Length=StrLength(&S); printf("\n串S的长度为%d:",Length); } else printf("\n串S与串T的连接为成功!"); printf("\n请输入要截取串S的其实位置与截取的长度值分别为:"); scanf("%d %d",&pos,&len); printf("将串S从第%d个字符开始,将长度为%d的字符序列复制到串Sub中",pos,len); if(SubString(&Sub,&S,pos,len)) { printf("\n串Sub为:"); DispStr(&Sub); Length=StrLength(&Sub); printf("\n串Sub的长度为%d:",Length); } loc = StrIndex(&S,&T); if(loc==-1) printf("\n串S与串T匹配失败!"); else printf("\n串S与串T匹配!匹配位置为%d:",loc);}