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

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

我正在尝试创建一个函数,该函数将执行与C中的
strtok()
函数相同的工作。下面是我的代码,但问题是每次我运行此程序时,它只显示第一个标记化字符串,然后程序停止,Windows显示一个弹出窗口,说“……已停止工作……”&then 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);
    }
}
#包括
#包括
#包括
字符a[1000],b[50];
int i=0;
char*mystrtok(char a[],char b[]
{
字符c[1000];
char*ptr=malloc(1000*sizeof(c));
ptr=c;
c[0]='\0';
如果(a==NULL)
++一,;
其他的
i=0;
/*printf(“i是=%d\n”,i);
免费(ptr)*/
//printf(“c的长度为%d”,strlen(c));
int j=0,标志;
//ptr=realloc(ptr,sizeof(c));
对于(i=i;a[i]!='\0';i++)
{
对于(j=0;b[j]!='\0';j++)
{
如果(a[i]==b[j])
{
c[i]='\0';
返回ptr;
}
其他的
{
flag=0;
c[i]=a[i];
继续;
}
}
}
/*如果(!标志)
c[i]='\0'*/
返回ptr;
}
int main()
{
int k;
printf(“输入一个大字符串:”);
获得(a);
printf(“输入令牌:”);
获取(b);
字符*标记化;
标记化=mystrtok(a,b);
看跌期权(标记化);
while(标记化)
{
标记化=mystrtok(NULL,b);
看跌期权(标记化);
}
}

我花了很多时间寻找我的代码有什么问题,我也通过Google&Stack Overflow帮助进行了搜索,但没有什么确切的帮助。

您有一些bug。从顶部开始,为
ptr
分配内存,然后用
c
覆盖它,从而丢失对它的引用。这是一个内存泄漏(而且还因为你从来没有释放过它)

我认为主要的问题是,当第二个调用通过
NULL
时,您丢失了对上一个调用中应该搜索的字符串的引用。您必须拥有一些在函数调用之间保持的内存<代码>静态变量非常适合于此

最后,
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;
}
#包括
char*mystrtok(char*str,const char*delim){
int i=0,j;
静态字符*ptr=“”;
int-found;
//新str,新搜索
如果(str!=NULL){
ptr=str;
}
//跳过熟食店
而(ptr[i]!='\0'){
发现=1;
对于(j=0;delim[j]!='\0';j++){
if(ptr[i]==delim[j]){
发现=0;
打破
}
}
如果(找到){
打破
}
i++;
}
如果(ptr[i]='\0'){
返回NULL;
}否则{
ptr+=i;
}
//找到下一个熟食店
发现=0;
而(ptr[i]!='\0'){
对于(j=0;delim[j]!='\0';j++){
if(ptr[i]==delim[j]){
ptr[i]='\0';
发现=1;
打破
}
}
如果(找到){
打破
}
i++;
}
//记录开始,高级ptr
str=ptr;
ptr+=i;
//只跳过熟食店
如果(找到){
ptr++;
}
返回str;
}
int main(){
字符a[1000];
charb[50];
printf(“输入一个大字符串:”);
获得(a);
printf(“输入令牌:”);
获取(b);
char*tokenized=mystrtok(a,b);
while(标记化!=NULL){
看跌期权(标记化);
标记化=mystrtok(NULL,b);
}
返回0;
}

Fakruddin Gazzali标准函数strtok不分配内存。此外,您的实现有一个内存泄漏char*ptr=malloc(1000*sizeof(c));ptr=c;因为指针被重新分配,所以分配的内存地址丢失。我应该删除它吗?但是如果要删除它,我如何才能取回指向该字符串c的指针?昨天我读到,如果我想让函数返回字符串,那么我应该使用
malloc()
并为该字符串指定一个指针?这是错的吗?很抱歉,我对指针格式化/缩进没有太多了解:(@Md.FakruddinGazzaliFahim是的,您应该删除分配,因为在任何情况下,内存没有使用,其地址都会丢失。此外,函数使用全局变量i也是一个坏主意。请注意,您分配的内存为1兆字节,这似乎有些过头。