【发布时间】: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 兆字节的内存,这似乎有点过头了。