跳到正文

4.1.2 串的存储结构

40 分钟

4.1.2 串的存储:结尾标记、长度字段与空间策略

顺序存储把字符放在连续数组中,适合按下标访问和高速扫描。C 风格串以 \0 作为结束标记,逻辑长度不包含它;容量必须为所有字符再加一个结束位。若数组容量 8,最多安全保存 7 个普通字符。

另一种实现显式保存 length,字符数据可包含 \0,也能 求长;但与 C 库函数交互时要转换。固定数组简单却可能截断,动态数组可按需扩容。连接长度为 的两串至少要复制 个字符,时间 ,并先确认容量或申请新空间。

typedef struct { char data[256]; size_t length; } SString;
int concat(SString *out,const SString *a,const SString *b){
 if(a->length+b->length>256)return 0;
 for(size_t i=0;i<a->length;i++)out->data[i]=a->data[i];
 for(size_t j=0;j<b->length;j++)out->data[a->length+j]=b->data[j];
 out->length=a->length+b->length;return 1;
}

块链存储把若干字符装入一个链结点,适合长度变化大且不要求随机访问的情况。每结点只放一个字符会导致指针开销极高;每结点放一块可提高存储密度,但跨块匹配更复杂。

手工推演:容量 6 的 C 字符数组写入 'hello' 后还需下标 5 存 \0,已满;继续连接 '!' 会越界。若结构显式容量为 6 且不要求结尾标记,则可存 6 个字符,但不能直接交给 strlen

错解反馈:把 sizeof(array) 当任意字符串长度;复制字符却忘写 \0;动态扩容后继续使用旧指针;连接时输出与输入缓冲区重叠却未约定处理,都会造成错误。

迁移题:C 风格缓冲区容量 12 最多存多少个普通字符?答案 11。独立验收:能说明三种长度表示法,并为复制、连接、截取各设计一个空串与容量边界测试。

小纸条

单选:容量12的C字符数组最多安全保存多少个普通字符?A 10 B 11 C 12 D 13

登录 后可看答案

Practice

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。