采用堆分配存储结构的串的SubString函数用在结尾人工加'\0'吗?

inter18099 2013-07-12 03:11:59
Status SubString(HString *Sub, HString T, int pos, int len) {
int i;
if(pos < 1 || pos > StrLength(T) || len < 0 || len > StrLength(T) - pos + 1) {
return ERROR;
}
if((*Sub).ch) {
free((*Sub).ch);
}
(*Sub).ch = (char *) malloc(len * sizeof(char));
if(!(*Sub).ch) {
exit(OVERFLOW);
}
for(i = 0; i < len; i++) {
(*Sub).ch[i] = T.ch[pos + i - 1];
}
(*Sub).ch[i] = '\0';
(*Sub).length = len;
return OK;
}


在上面的SubString()函数的倒数第3行,我在串的结尾上工加上了'\0',因为我发现不加这一句的话,下面这段代码打印出的字符后面会带很多空格或者乱码,加'\0'了就不会带了。这是否说明编译器在编译时没有自动加上'\0'啊。



void main() {
int i;
HString S1, Sub;
char *SS1 = "beijing";
InitString(&Sub);
InitString(&S1);
StrAssign(&S1, SS1);
SubString(&Sub, S1, 1, 3);
for(i = 0; Sub.ch[i] != '\0'; i++) {
printf("%c", Sub.ch[i]);
}
}


...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
是的
inter18099 2013-07-12
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
你是说 malloc 应该帮你初始化成 0? 编译器只会在你定义双引号的时候 "xxx" 会帮你加 0, 其余时候你得自己处理.
也就是说当我用malloc开出一块空间,然后用 (*Sub).ch[i] = T.ch[pos + i - 1];从另一个数组中复制字符到Sub数组,然后这时编译器不会帮我在Sub数组的结尾加\0,需要我自己加。 然后当我用这样的表达式时,Sub[] = "beijing"; ,编译器会给加\0。 是这样吗?
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
你是说 malloc 应该帮你初始化成 0? 编译器只会在你定义双引号的时候 "xxx" 会帮你加 0, 其余时候你得自己处理.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧