数据结构C语言串。用StrAssign和Concat编写一个连接26个英文字母和0到9的算法。 串为堆分配存储表示。

#include<stdio.h>
#include<stdlib.h>

#define OVERFLOW -2
#define OK 1

typedef struct {
char * ch;
int length;
}HString;

typedef char Status;

Status StrAssign(HString &T,char * chars){
int i,j;char * c;
if(T.ch) free(T.ch);
for(i=0,c=chars; c; ++i,++c);
if(!i){
T.ch=NULL;T.length=0;
}
else{
if(!(T.ch=(char *)malloc(i*sizeof(char)))) exit(OVERFLOW);
for(j=0;j<=i-1;j++)
T.ch[j]=chars[j];
T.length=i;
}
return OK;
}

Status Concat(HString &T,HString S1,HString S2){
int i;
if(T.ch) free(T.ch);
if(!(T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char)))) exit(OVERFLOW);
for(i=0;i<=S1.length-1;i++)
T.ch[i]=S1.ch[i];
T.length=S1.length+S2.length;
for(i=0;i<=S2.length-1;i++)
T.ch[i+S1.length]=S2.ch[i];
return OK;
}

void main(){
HString T,S1,S2;int i;
char *a="abcdefghijklmnopqrstuvwxyz",*b="0123456789";
StrAssign(S1,a);
StrAssign(S2,b);
Concat(T,S1,S2);
for(i=0;i<=T.length;i++)
printf("%c",T.ch[i]);
}

这是我编的,用VC运行,没有错误,但是不能执行啊!!!!!

1. 程序中for(i=0,c=chars; c; ++i,++c);语句是个for循环但其循环体是空语句,目的是让指针c指到chars的最后一个字符的后面。现实环境运行中这里是死循环!!!改为
for(i=0,c=chars; *c; ++i,++c);
2.if(T.ch) free(T.ch);这条语句在运行中会发生内存读写错误!!!改正方法:
在main函数中:
HString T,S1,S2;
T.ch = 0; T.length = 0;//增加初始化
S1.ch = 0; S1.length = 0;//增加初始化
S2.ch = 0; S2.length = 0;//增加初始化
int i;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-21
都是光明,仅是光明。
并不是铁。
我命运之光清高的离去,
语言学
退走后,紫罗兰开始在
从此各为天涯哈哈本回答被提问者采纳
第2个回答  2012-10-20
连接26个英文字母和0到9的算法 什么意思。追问

就是连接abcdefghijklmnopqrstuvwxyz和0123456789的算法

追答

不懂,直接打abc....56789不是连接在一起了吗。

追问

所以才要用Concat函数连接啊

追答

Status StrAssign(HString &T,char * chars){
int i,j;char * c;
if(T.ch) free(T.ch);
for(i=0,c=chars; c; ++i,++c); //条件恒成立指针不为空,死循环,改为 *c != '\0'

if(!i){
T.ch=NULL;T.length=0;
}
else{
if(!(T.ch=(char *)malloc(i*sizeof(char)))) exit(OVERFLOW);
for(j=0;j<=i-1;j++)
T.ch[j]=chars[j];
T.length=i;
}
return OK;
}

追问

那不是死循环,后面有分号的。

追答

for(i=0,c=chars; c; ++i,++c); //后面有分号跟循环条件没关系,循环条件c恒为真。

相似回答