我调用下面用C语言编写的函数来获取孩子的父母 -
char *getParent(char *child)
{
int len = strlen(child);
char *parent;
parent = strdup(substring(child, 0, len - 4));
return parent;
}
char *substring(const char* str, int beg, int n)
{
char *ret = malloc(n+1);
strncpy(ret, (str + beg), n);
*(ret+n) = '\n';
return strdup(ret);
}
孩子是 - '11112222' 现在我期待输出 - '1111'但是这个功能也在1111之后增加了额外的空间,就像这个'1111 ---这里我得到空间----'。 这个功能出了什么问题?
答案 0 :(得分:3)
此:
*(ret+n) = '\n';
错了,应该是:
*(ret+n) = '\0';
终止字符串。您正在添加换行符,而不是终结符,因此无法生成有效的字符串。
另外,我建议更喜欢索引,因为它在语法上更清晰:
ret[n] = '\0';
当然,您应该在依赖它之前检查malloc()
的返回值。
更新:天哪,删除strdup()
,现在已经malloc()
编辑了新字符串,这完全没有意义。
应该只是:
char * substring(const char *str, size_t beg, size_t n)
{
char *ret = malloc(n + 1);
if(ret != NULL)
{
strncpy(ret, str + beg, n);
ret[n] = '\0';
}
return ret;
}
这仍假设偏移量和长度有效,str
为非NULL
。