【问题标题】:C adding extra spaces in trimmingC 在修剪中添加额外的空格
【发布时间】:2014-02-07 09:14:23
【问题描述】:

我调用下面用 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---这里我得到空间----'。 这个函数有什么问题?

【问题讨论】:

  • substring 是您编写的函数还是库的一部分?
  • @CyrilFougeray 不,strlen() 肯定不包括终止符,它不是字符串长度的一部分。 strlen("") 为 0。
  • *(ret+n) = '\n';确实添加了换行符。你需要加一个0:*(ret+n) = '\0';
  • 抱歉,现在添加了有问题的子字符串函数。
  • *(ret+n) = '\n' 应该是ret[n] = '\0',如果你已经在使用malloc,也不要使用strdup

标签: c substring


【解决方案1】:

这个:

*(ret+n) = '\n';

错了,应该是:

*(ret+n) = '\0';

终止字符串。您添加的是换行符,而不是终止符,因此无法生成有效的字符串。

另外,我建议您优先使用索引,因为它在语法上更简洁:

ret[n] = '\0';

当然,你应该在依赖它之前检查malloc()的返回值。

更新:天哪,删除那个strdup(),现在你已经malloc()ed你的新字符串完全没有意义。

应该只是:

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

【讨论】:

  • @sidd:不完全是,它泄漏了,strdup 是不必要的。
  • @KarolyHorvath Gaah,完全错过了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多