【问题标题】:What does this function return ? (sometimes same string, sometimes missing a char) [closed]这个函数返回什么? (有时相同的字符串,有时缺少一个字符)[关闭]
【发布时间】:2020-07-22 16:38:47
【问题描述】:

这段代码究竟做了什么? 有时它返回相同的字符串,有时该字符串缺少一个字符。这是为什么呢?

char *string_dup(const char *s) {
    size_t n = strlen(s);
    char *t = malloc(n * sizeof(char));
    if (t == NULL) return t;
    for (unsigned int i = 0; i < n; ++i) 
        t[i] = s[i];
    t[n - 1] = '\0';
    return t;
}

【问题讨论】:

  • 创建缺失字符和非缺失字符的minimal reproducible example
  • 具体哪一部分你不明白?你知道strlen 做什么吗? malloc 做什么? t[n - 1] = '\0' 有意义吗?您是否尝试使用一些示例值跟踪逻辑?
  • 不,我明白这一切,但我尝试用“hello”作为示例执行它,它第一次显示“hell”,然后显示“hello”,这是为什么?
  • 好吧,一方面它不会返回与源字符串完全相同的副本。使用调试器单步调试代码,同时监控变量及其值,看看它实际做了什么。
  • 这是 C,不是 C++

标签: c string pointers char


【解决方案1】:

这段代码究竟做了什么?

它...

  • 接受指向以空字符结尾的字符串的指针。
  • 为比输入字符串短 1 个字符的空终止字符串分配内存。
  • 将输入字符串复制到内存中,不包括空终止符。
  • 在最后一个字符上写入空终止符。
  • 返回指向包含复制的子字符串的已分配内存的指针。

附:避免在 C++ 中使用 malloc。

P.P.S.避免在 C++ 中拥有裸指针。

P.P.P.S.如果输入字符串为空,则程序的行为未定义。有意义,因为空字符串不包含严格较短的子字符串。

P.P.P.P.S. * sizeof(char) 是多余的,因为 sizeof(char) 始终为 1。

【讨论】:

  • 在第 2 点上,我会强调缺少的字符是因为 strlen 不计算空终止符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2016-01-18
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多