数组值不更新
array value not updating
我有一个 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] = '[=10=]';
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
在 tokenizer
内用 arr[j]
更新,但一旦 tokenizer
完成并且帧移回 main
.
就会变为零
main
中p
的值并没有变成NULL
,而是变成了一个空字符串,打印出来!
但是,如果包含 tokenizer
中的 printf
,main
中的 p
会打印令牌。
这已经包含解决方法。我知道这不可能是 strtok 的实现方式。我从一个更复杂的 "expertish" 版本开始,它有指针,但无法让它工作,所以选择了这个 "beginner" 版本。
因为你的指针指向的是栈中的内存地址,一旦你的函数返回,指向的内存地址不存在了,你需要创建动态分配的内存来访问函数外的变量。 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] = '[=10=]';
// return pointer
return arr;
}
您应该确保释放 main 中的内存以防止内存泄漏。
我有一个 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] = '[=10=]';
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
在 tokenizer
内用 arr[j]
更新,但一旦 tokenizer
完成并且帧移回 main
.
main
中p
的值并没有变成NULL
,而是变成了一个空字符串,打印出来!
但是,如果包含 tokenizer
中的 printf
,main
中的 p
会打印令牌。
这已经包含解决方法。我知道这不可能是 strtok 的实现方式。我从一个更复杂的 "expertish" 版本开始,它有指针,但无法让它工作,所以选择了这个 "beginner" 版本。
因为你的指针指向的是栈中的内存地址,一旦你的函数返回,指向的内存地址不存在了,你需要创建动态分配的内存来访问函数外的变量。 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] = '[=10=]';
// return pointer
return arr;
}
您应该确保释放 main 中的内存以防止内存泄漏。