首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言数据结构里顺序串的有关问题

2012-11-20 
C语言数据结构里顺序串的问题以下的程序是顺序串的操作:无错误,可为何执行的时候出错(屏幕上什么也没有)请

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);

}


[解决办法]

C/C++ code
//可以运行,后一部分没有检查。#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);} 


[解决办法]

C/C++ code
#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);} 

热点排行