【发布时间】:2017-04-07 08:32:41
【问题描述】:
我正在从文件中读取一行文本,并尝试使用strtok() 将其拆分为空格,然后在名为tokenize 的函数中使用strcpy() 将每个标记存储在一个字符指针数组中。
代码:
/**
** Tokenizes contents of buffer into words
** Delimiter is a space character
*/
void tokenize(char *buffer, char *tokens[]){
char *token = NULL;
int i = 0;
token = strtok(buffer, " ");
while(token != NULL){
strcpy(tokens[i], token);//seg fault line
token = strtok(NULL, " ");
i++;
}
}
我假设,根据 K&R 中的函数描述,我的调用会起作用,因为我传递了一个 char 指针,这是 tokens[i] 应该取消引用的,以及另一个包含字符串内存地址的 char 指针复制,这就是token 应该是什么。但是,当我尝试strcpy 时,我遇到了段错误。
在通过调用fgets() 检索到一行后立即在main 中调用此函数。 buffer 被声明为 char buffer[MAXLINE_LEN - 1],它的大小为 100。tokens 被声明为 char *tokens[MAXLINE_LEN - 1]。
在main 中致电tokenize:
while(fgets(buffer, MAXLINE_LEN, inputFile)){
int choice;
printf("%s", buffer);
tokenize(buffer, tokens);
/**
....
*/
}
我正在使用:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
编辑:
tokens 的声明(这发生在上面显示的 while 循环之前,在 main 中):
char *tokens[MAXLINE_LEN - 1];//MAXLINE_LEN - 1 = 100
int a;
for(a = 0; a < MAXLINE_LEN - 1; a++)
tokens[a] = NULL;
【问题讨论】:
-
您的问题与您没有向我们展示的
tokens的声明/初始化有关。 -
tokens[i] = malloc(strlen(token)+1);在strcpy(tokens[i], token);之前 -
@BLUEPIXY 我必须为
tokens中的每个字符指针分配堆内存?我第一次在 main 中声明tokens时没有分配内存吗? -
请否决投票者澄清一下吗?
-
指针在数组中分配。但不是指针指向的区域。