我的strtok()实现(C)有什么问题?

时间:2018-04-30 23:58:00

标签: c string implementation strtok

显然,被调用它会卡在字符串中的第一个单词上,而不会触及其余部分。我不明白为什么。

int Belongs(char c, const char *delim)
{
    int i;
    i=0;
    while(delim[i]!=0)
    {
        if(delim[i]==c) return 1;
        i++;
    }
    return 0;
}

char *p; 

char *Sstrtok(char *str, const char *delim)
{
    int i;
    i=0;
    if(str==NULL)
    {
        str=p++;
    }
    while(str[i]!=0) 
    {
        if(Belongs(str[i], delim)==1)
        {
            str[i]=0;
            p=str+i;
            return str;
        }
        i++;
    }
    return NULL;
}

感谢您的考虑。

2 个答案:

答案 0 :(得分:0)

str = p++;

你必须做错了

str = p + 1;

str = ++p;

但是str = p + 1更好,因为即使它返回NULL

,它也会保存以调用两倍或更多的函数

如果找不到分隔符,则还有另一个问题:不返回字符串:

return NULL;

可能的解决方法:

p = str + i;
return *str ? str : NULL;

完整代码已修复:

#include <stddef.h>

int Belongs(char c, const char *delim) {
  int i;
  i = 0;
  while (delim[i] != 0) {
    if (delim[i] == c)
      return 1;
    i++;
  }
  return 0;
}

char *p;

char *Sstrtok(char *str, const char *delim) {
  int i;
  i = 0;
  if (str == NULL) {
    str = p + 1;
  }
  while (str[i] != 0) {
    if (Belongs(str[i], delim) == 1) {
      str[i] = 0;
      p = str + i;
      return str;
    }
    i++;
  }

  p = str + i;
  return *str ? str : NULL;
}

答案 1 :(得分:0)

Belongs()的实施似乎没问题,但Sstrtok有多个问题:

  • 如果使用非NULL作为第一个指针调用,则应首先扫描第一个非分隔符。
  • 如果找不到,请返回NULL
  • 否则,保存返回的指针并扫描第一个分隔符
  • 如果未找到,则返回指针并将静态变量设置为NULL
  • 否则,将其替换为空字节,将指针存储到静态变量中的下一个字节并返回已保存的指针。
  • 使用NULL指针作为第一个参数调用该函数,使用静态指针执行上述步骤。

以下是修改后的版本:

#include <stddef.h>

int Belongs(char c, const char *delim) {
    int i;
    for (i = 0; delim[i] != '\0'; i++) {
        if (delim[i] == c)
            return 1;
    }
    return 0;
}

char *Sstrtok_static_state;

char *Sstrtok(char *str, const char *delim) {
    int i;
    char *result;
    if (str == NULL) {
        str = Sstrtok_static_state;
        if (str == NULL)
            return NULL;
    }
    Sstrtok_static_state = NULL;
    for (i = 0; str[i]; i++) {
        if (!Belongs(str[i], delim)) {
            result = str + i;
            for (i++; str[i]; i++) {
                if (Belongs(str[i], delim)) {
                    str[i] = '\0';
                    Sstrtok_static_state = str + i + 1;
                    return result;
                }
            }
            return result;
        }
    }
    return NULL;
}