我有一个strtok实现(有点),但它没有打印令牌!
char *tokenizer(char s[], const char *delimiter) {
char *p; //return value of function
int i = 0;
while(s[i] != *delimiter) //to get the size of array just right
i++;
char arr[i+1];
p = arr; //can't return an array, so assigned to a
//pointer
int j = 0;
i = 0;
while(s[i]!=*delimiter) {
arr[j] = s[i];
i++;
j++;
}
arr[j] = '\0';
printf("%s\n",p); //this statement works, but if excluded
//main prints nothing.
return p;
}
此函数从main:
调用如下char s[] = "tab-tab";
const char del[2] = "-";
char *p;
p = tokenizer(s, del);
printf("%s\n", p); //prints nothing without the printf in
//tokenizer
我尝试用gdb进行调试,并在每一行之后检查局部变量的值。 p
已在arr[j]
内更新为tokenizer
,但tokenizer
完成后会转为零,并且框架会移回main
。
p
中main
的值不会变为NULL
,它会变为空字符串,并打印出来!
但是,如果p
中包含main
,则printf
中的tokenizer
会打印令牌。
这已经包含了解决方法。我知道这可能是实施strtok的方式。我从一个更复杂的,#34;熟练的"开始有指针的版本,但无法使它工作,因此已经适应了这个"初学者"版本
答案 0 :(得分:1)
这是因为你的指针指向堆栈中的内存地址,一旦你的函数被返回,指向的内存地址不再存在,你需要创建动态分配的内存来访问函数之外的变量。 C
char *tokenizer(char s[], const char *delimiter) {
char *arr;
int i = 0;
while(s[i] != *delimiter)
i++;
// Initialize variable in the heap
if (!(arr = malloc(sizeof(char *) * (i+1))))
return NULL;
// Clear the array
bzero(arr, (i+1));
int j = 0;
i = 0;
while(s[i]!=*delimiter) {
arr[j] = s[i];
i++;
j++;
}
arr[j] = '\0';
// return pointer
return arr;
}
您应该确保释放主内存以防止内存泄漏。