gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:08:33 26 4
gpt4 key购买 nike

我正在尝试创建一个函数,该函数将执行与 C 中的 strtok() 函数相同的工作。下面是我的代码,但问题是每次我运行这个程序时,它仅显示第一个标记化字符串,然后程序停止,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 帮助进行了搜索,但没有任何帮助。

最佳答案

您有一些错误。从顶部开始,您为 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;
}

关于C - mystrtok() 函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com