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

上面是堆分配存储结构的串的逆置,输出的都是一些乱码,有关问题在哪里呢

2012-07-31 
下面是堆分配存储结构的串的逆置,输出的都是一些乱码,,问题在哪里呢#include stdio.h#include stdlib.h

下面是堆分配存储结构的串的逆置,输出的都是一些乱码,,问题在哪里呢
#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里面的值已经被拷贝到另一个内存中去了。不知道这个想法对不对

热点排行