C - mystrtok()函数有什么问题?

时间:2017-07-09 13:29:02

标签: c string pointers strtok

我正在尝试创建一个与strtok()函数在C中执行相同工作的函数。下面是我的代码,但问题是每次运行此程序时,它只显示第一个标记化字符串,然后程序停止,Windows显示弹出窗口“.....已停止工作......”&然后Code :: Blocks返回-1073741819(0XC0000005)。我不知道为什么会这样 - 你能解释一下吗?

我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char a[1000],b[50];
int i=0;

char *mystrtok(char a[],char b[])
{
    char c[1000];
    char *ptr = malloc(1000*sizeof(c));
    ptr = c;
    c[0] = '\0';

    if(a == NULL)
        ++i;
    else
        i=0;

    /*printf("i is = %d\n",i);
    free(ptr);*/

    //printf("len of c is%d",strlen(c));
    int j=0,flag;

    //ptr = realloc(ptr,sizeof(c));
    for(i=i;a[i] != '\0';i++)
    {
        for(j=0;b[j] != '\0';j++)
        {
            if(a[i] == b[j])
            {
                c[i] = '\0';
                return ptr;
            }
            else
            {
                flag = 0;
                c[i] = a[i];
                continue;
            }
        }
    }
    /*if(!flag)
        c[i] = '\0';*/
    return ptr;
}

int main()
{
    int k;
    printf("Enter a big string: ");
    gets(a);
    printf("Enter a token: ");
    gets(b);

    char *tokenized;
    tokenized = mystrtok(a,b);
    puts(tokenized);

    while(tokenized)
    {
        tokenized = mystrtok(NULL, b);
        puts(tokenized);
    }
}

我花了很多时间来查找我的代码有什么问题,而且我已经搜索了Google&amp; Stack Overflow帮助,但没有任何帮助我。

1 个答案:

答案 0 :(得分:1)

你有一些错误。在顶部,您为ptr分配内存,然后通过用c覆盖它来丢失对它的引用。那是一次内存泄漏(也是因为你永远不会free)。

我认为的主要问题是,当第二个呼叫通过NULL时,您丢失了对您应该从之前呼叫中搜索的字符串的引用。您必须在函数调用之间保留一些内存。 static变量非常适用于此。

最后,main中的循环的语句顺序相反。

#include <stdio.h>

char *mystrtok(char *str, const char *delim) {
  int i = 0, j;
  static char *ptr = "";
  int found;

  // new str, new search
  if(str != NULL) {
    ptr = str;
  }

  // skip delims
  while(ptr[i] != '\0') {
    found = 1;
    for(j = 0; delim[j] != '\0'; j++) {
      if(ptr[i] == delim[j]) {
        found = 0;
        break;
      }
    }

    if(found) {
      break;
    }

    i++;
  }

  if(ptr[i] == '\0') {
    return NULL;
  } else {
    ptr += i;
  }

  // find next delim
  found = 0;
  while(ptr[i] != '\0') {
    for(j = 0; delim[j] != '\0'; j++) {
      if(ptr[i] == delim[j]) {
        ptr[i] = '\0';
        found = 1;
        break;
      }
    }

    if(found) {
      break;
    }

    i++;
  }

  // record start, advance ptr
  str = ptr;
  ptr += i;

  // only skip delims
  if(found) {
    ptr++;
  }

  return str;
}

int main() {
  char a[1000];
  char b[50];

  printf("Enter a big string: ");
  gets(a);

  printf("Enter a token: ");
  gets(b);

  char *tokenized = mystrtok(a, b);

  while(tokenized != NULL) {
    puts(tokenized);
    tokenized = mystrtok(NULL, b);
  }

  return 0;
}