【问题标题】:C - What's wrong with mystrtok() function?C - mystrtok() 函数有什么问题?
【发布时间】:2017-07-09 13:29:02
【问题描述】:

我正在尝试创建一个与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 和 Stack Overflow 帮助进行了搜索,但没有任何帮助。

【问题讨论】:

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

标签: c string pointers strtok


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多