读书人

上面是堆分配存储结构的串的逆置输出

发布时间: 2012-07-31 12:33:46 作者: rapoo

下面是堆分配存储结构的串的逆置,输出的都是一些乱码,,问题在哪里呢
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define Init_Str_Size 100

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

void InitString (HString &T)
{
T.ch = NULL;
T.length = 0;
}

void StrCreate (HString &T) //生成串
{
char c;
T.ch = (char *) malloc(Init_Str_Size * sizeof(char));
if (! T.ch) exit (OVERFLOW);
T.length = 0;
while ((c = getchar()) != '\n')
{
T.ch[T.length] = c;
T.length++;
}
}

int StrLength (HString S)
{
return S.length;
}

int StrAssign (HString &T, char * chars) //生成一个其值等于串常量chars的串T
{
char * c;
int i, j;
if (T.ch) free (T.ch);
for (i = 0, c = chars; * c; i++, c++);
if (!i) { T.ch = NULL; T.length = 0; }
else {
T.ch = (char *) malloc(i * sizeof(char));
if (! T.ch) exit (OVERFLOW);
for (j = 0; j < i; j++)
T.ch[j] = chars[j];
T.length = i;
}
return OK;
}

int StrCompare (HString S, HString T) //比较S和T
{
int i;
for (i = 0; i < S.length && i < T.length; i++)
if (S.ch[i] != T.ch[i]) return S.ch[i] - T.ch[i];
return S.length - T.length;
}

void ClearString (HString &S)
{
if (S.ch) { free (S.ch); S.ch = NULL; }
S.length = 0;
}

void Concat (HString &T, HString S1, HString S2) //用T返回由S1和S2联接而成的新串
{
int i, j;
if (T.ch) free (T.ch);
T.ch = (char *) malloc((S1.length + S2.length) * sizeof(char));
if (! T.ch) exit (OVERFLOW);
for (i = 0; i < S1.length; i++)
T.ch[i] = S1.ch[i];
for (i = 0, j = S1.length; i < S2.length; i++, j++)
T.ch[j] = S2.ch[i];
T.length = S1.length + S2.length;
}

int SubString (HString &Sub, HString S, int pos, int len) //用Sub返回串S的第pos个字符起长度为len的子串
{
int i;
if (pos < 1 || pos > S.length || len < 0 || len > S.length - pos + 1)
return ERROR;
if (Sub.ch) free (Sub.ch);
if (! len) { Sub.ch = NULL; Sub.length = 0; }
else {
Sub.ch = (char *) malloc(len * sizeof(char));
pos = pos -1;
for (i = 0; i < len; i++)
Sub.ch[i] = S.ch[pos++];
Sub.length = len;
}
return OK;
}

void StrPrint (HString T)
{
int i;
for (i = 0; i < T.length; i++)
putchar (T.ch[i]);
putchar ('\n');
}

void StringReverse (HString &T, HString S) //串逆置
{
HString P;
InitString (P);
int i;
for (i = S.length; i > 0; i--)
{
SubString (P, S, i, 1);
Concat (T,T,P);
}
}

int main(void)
{
HString S, T;
InitString (T);
StrCreate (S);
StrPrint (S);
StringReverse (T, S);
StrPrint (T);
}

[解决办法]

C/C++ code

void Concat (HString &T, HString S1, HString S2) //用T返回由S1和S2联接而成的新串{  int i, j;  if (T.ch) free (T.ch);  T.ch = (char *) malloc((S1.length + S2.length) * sizeof(char));  if (! T.ch) exit (OVERFLOW);  for (i = 0; i < S1.length; i++)  T.ch[i] = S1.ch[i];  for (i = 0, j = S1.length; i < S2.length; i++, j++)  T.ch[j] = S2.ch[i];  T.length = S1.length + S2.length;}
[解决办法]
探讨
这个我考虑到了,但是后来想到因为第二个形参不是它的值的一份拷贝吗?所以即使原来的T.ch被释放掉,T里面的值已经被拷贝到另一个内存中去了。不知道这个想法对不对

读书人网 >C语言

热点推荐