【问题标题】:Function not returning NULL函数不返回 NULL
【发布时间】:2016-01-30 04:16:39
【问题描述】:

我正在尝试编写一个函数,该函数返回从初始函数参数复制的指针,但开头和结尾没有空格('','\n','\t')。

char    *ft_strtrim(char const *s)
{

    unsigned char   *p;
    int             start;
    int             end;
    size_t          index;

    start = 0;
    end = ft_strlen(s) - 1;
    while (s[start] == '\n' || s[start] == '\t' || s[start] == ' ')
        start++;
    while (s[end] == '\n' || s[end] == '\t' || s[end] == ' ')
        end--;
    if (start == 0 && end == ft_strlen(s) - 1)
        return ((char*)s);
    if (end - start < 0)
        return (NULL);
    printf("%d\n", end - start);
    p = (char*)malloc(sizeof(char) * (end + 1 - start));
    index = 0;
    while(start <= end)
    {
        p[index] = s[start];
        index++;
        start++;
    }
    p[index] = '\0';
    return (p);
}

我想在 end - start 的值低于 0 时返回 NULL。即使在我用于调试函数之后的 printf 中,该值是负数,但当我编译时,该函数不返回 NULL代码我得到分段错误。

【问题讨论】:

  • 如果 strlen(s) == 0end == -1s[end] 是未定义的行为。
  • ft_strlen 的定义是什么,这个函数的输入是什么?
  • 全空格字符串也是个问题。 while (s[end] == '\n' || s[end] == '\t' || s[end] == ' ') end--; 是 UB。
  • "当我编译代码时出现分段错误。' --> 你的意思是当你运行代码时,你得到一个分段错误?
  • 仅供参考 (end - start &lt; 0) 可以简化为 (end &lt; start)。发生这种情况的唯一情况是字符串为空或全是空格。这些正是您的代码导致未定义行为的情况,因为while 循环在到达字符串的开头或结尾时不会停止。

标签: c function pointers null char


【解决方案1】:

当我找到问题的答案时,我真的不知道该怎么办,这只是我的第二个问题。

我改变了条件

if (end < start)
   return (NULL);

并用于结束和开始 size_t 类型并知道它有效。非常感谢您的 cmets。

【讨论】:

  • 这个答案的代码while (s[end] == '\n' || s[end] == '\t' || s[end] == ' ') end--;之前的代码是个大问题。
【解决方案2】:

代码实际上是在修剪前导和尾随空格,但在许多条件下都有 UB,包括所有空格。

 while (s[end] == '\n' || s[end] == '\t' || s[end] == ' ')
    end--;

上述代码导致未定义行为,因为end &lt; 0s[end] 是未定义行为。

char *strtrim(char const *s) {
  // First first non-white-space
  while (isspace((unsigned char ) *s))
    s++;

  if (*s == 0) return NULL;

  // Find last non-WS
  const char *end = s;
  const char *last_non_space = s;
  while (*end) {
    if (!isspace((unsigned char ) *end)) {
      last_non_space = end;
    }
    end++;
  }

  // Allocate
  size_t length = (size_t) (last_non_space - s + 1);
  char *dest = malloc(length + 1);
  if (dest == NULL) return NULL;
  memcpy(dest, s, length);
  dest[length] = '\0';
  return dest;
}

【讨论】:

    【解决方案3】:

    也许你不是return (p);,而是return p[index];?只是一个建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2013-08-10
      • 2021-03-31
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多