串的堆分配储存表示
表示
class HString {
public:
char* ch; // 若是空串, 则按串长分配储存区, 否则 ch 为 NULL.
int length; // 串的长度.
}
初始化
这里暂时没想到其它简洁的初始化方法. 那我们用一个字符数组来给串初始化. 在上面的 class
里面这样写一个函数:
bool Assign(char* chars) {
int charsLength = 0;
if (ch) free(ch); // 释放T的原有空间
for (char* c = chars; *c; ++charsLength, ++c);
if (!charsLength) {
ch = NULL; length = 0;
} // if
else {
if (!(ch = (char*) malloc(charsLength * sizeof(char)))) exit(OVERFLOW);
for (int i = 0; i <= charsLength; i++) ch[i] = chars[i];
length = charsLength;
} // else
return 1;
} // Assign
在 main()
函数中, 如果像下这样写, 会发现虽然输出来看上去正确, 但 s1.length
为 6
:
int main() {
char cStr[] = {'W', 'o', 'r', 'l', 'd'};
HString s1;
s1.Assign(cStr);
printf("s1.length = %d\n", s1.Length());
s1.Show();
return 0;
}
我们加上一句 printf("s1.ch[5]: %c, %d\n", s1.ch[5], s1.ch[5]);
发现 s1.ch[5]
为 '\127'
, 即 DEL
. 说明用 Assgin()
的时 world 后面还有一个 '\127'
然后才是 '\0'
.
把 main()
中的 cStr[]
最后加一个 '\0'
或者写成 cStr[] = {"World"};
就能解决这个问题.