在 C 中使用 strtok()
Use strtok() in C
char* path = (char*)malloc(size); // path = "abc/def/ghi[=10=]"
char** savearr1 // no malloc
char* savearr2[100]; // no malloc
这种情况,我用strtok(savearr1 or savearr2, "/");
/* if I start this code1 */
while(...) // strtok loop
strtok(savearr1[i], "/")
/* if I start this code2 */
while(...) // strtok loop
strtok(savearr2[i], "/")
code1 while-loop 是分段错误,
code2 while-loop 成功完成
我有疑问为什么 code1 是分段错误。
strtok 中的 char*[] 和 char** 行为是否不同?
这是代码,
int makeFile(const char* fname, FileType type){
char* path = (char*)malloc(strlen(fname)+1);
char* fnames[PATH_LEN];
memcpy(path, fname, strlen(fname));
path[strlen(fname)] = '[=12=]';
int num = 0;
int ino;
fnames[num++] = strtok(path, "/");
while(fnames[num++] = strtok(NULL, "/"));
if(strcmp(fnames[0], "") == 0) return -1;
if(num == 2){
makeEntry(pFileSysInfo->rootInodeNum, fnames[0], type);
}
else{
ino = findEntry(pFileSysInfo->rootInodeNum, fnames[0]);
for(int i=1; i<num-2; i++)
ino = findEntry(ino, fnames[i]);
makeEntry(ino, fnames[num-2], type);
}
free(path);
}
我把char* fnames[PATH_LEN]改成char** fnames,在fnames[num++] = strtok(path, "/"); while(fnames[num++] = strtok(NULL, "/"));
出现分段错误
根据你的代码,我假设你从未初始化 char** savearr1
的大小,所以它指向 NULL 元素,当你尝试用它做一些事情(比如 printf)时,你会得到一个 segfault
即使 strtok
对 NULL
参数没有问题。这是一个代码示例,说明您应该如何使其正常工作,它既不完美也不完整,只是一个示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int size = 5; // size of your path string
int n = 5; // size of your string array
char* path = malloc(sizeof(char)*size);
sprintf(path,"c/a/");
char** arr1 = malloc(n * sizeof(char*));
arr1[0] = path;
int i = 0;
char* token;
// iterate over your string array
for( i = 0; i < n; i++){
// take your first string to tokenize
token = strtok(arr1[i],"/");
while(token != NULL){
printf("%s\n",token);
// keep tokenizing on arr1[i]
token = strtok(NULL,"/");
}
}
return 0;
}
char* path = (char*)malloc(size); // path = "abc/def/ghi[=10=]"
char** savearr1 // no malloc
char* savearr2[100]; // no malloc
这种情况,我用strtok(savearr1 or savearr2, "/");
/* if I start this code1 */
while(...) // strtok loop
strtok(savearr1[i], "/")
/* if I start this code2 */
while(...) // strtok loop
strtok(savearr2[i], "/")
code1 while-loop 是分段错误, code2 while-loop 成功完成
我有疑问为什么 code1 是分段错误。 strtok 中的 char*[] 和 char** 行为是否不同?
这是代码,
int makeFile(const char* fname, FileType type){
char* path = (char*)malloc(strlen(fname)+1);
char* fnames[PATH_LEN];
memcpy(path, fname, strlen(fname));
path[strlen(fname)] = '[=12=]';
int num = 0;
int ino;
fnames[num++] = strtok(path, "/");
while(fnames[num++] = strtok(NULL, "/"));
if(strcmp(fnames[0], "") == 0) return -1;
if(num == 2){
makeEntry(pFileSysInfo->rootInodeNum, fnames[0], type);
}
else{
ino = findEntry(pFileSysInfo->rootInodeNum, fnames[0]);
for(int i=1; i<num-2; i++)
ino = findEntry(ino, fnames[i]);
makeEntry(ino, fnames[num-2], type);
}
free(path);
}
我把char* fnames[PATH_LEN]改成char** fnames,在fnames[num++] = strtok(path, "/"); while(fnames[num++] = strtok(NULL, "/"));
根据你的代码,我假设你从未初始化 char** savearr1
的大小,所以它指向 NULL 元素,当你尝试用它做一些事情(比如 printf)时,你会得到一个 segfault
即使 strtok
对 NULL
参数没有问题。这是一个代码示例,说明您应该如何使其正常工作,它既不完美也不完整,只是一个示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int size = 5; // size of your path string
int n = 5; // size of your string array
char* path = malloc(sizeof(char)*size);
sprintf(path,"c/a/");
char** arr1 = malloc(n * sizeof(char*));
arr1[0] = path;
int i = 0;
char* token;
// iterate over your string array
for( i = 0; i < n; i++){
// take your first string to tokenize
token = strtok(arr1[i],"/");
while(token != NULL){
printf("%s\n",token);
// keep tokenizing on arr1[i]
token = strtok(NULL,"/");
}
}
return 0;
}