将行分割成单词,然后使用strtok将其放入char数组中

问题描述 投票:1回答:3

我将这个简单的行解析器放入标记函数中...但是我缺少一些东西。

int parse_line(char *line,char **words){

   int wordc=0;

   /* get the first token */
   char *word = strtok(line, " ");
   words[wordc]=(char*)malloc(256*sizeof(char));
   strcpy(words[wordc++],word );

   /* walk through other tokens */
    while( word != NULL ) {
        word = strtok(NULL, " ");
        words[wordc]=(char*)malloc(256*sizeof(char));
        strcpy(words[wordc++],word );
    }

    return wordc;
}

当我运行它时,我遇到了分割错误!我给第一个参数char [256]行,第二个当然是char **字,但我有第一个malloc内存。像这样>

  char **words = (char **)malloc(256 * sizeof(char *));
main:
.
.
.
char buffer[256];
char **words = (char **)malloc(256 * sizeof(char *));
.
.
.
n = read(stdin, buffer, 255);
if (n < 0){
   perror("ERROR");
   break;
}

parse_line(buffer,words);

当程序执行parse_line时,由于分段错误而退出

发现段故障发生的位置。它在这里的那一行上:

strcpy(words[wordc++],word );

特别是在第一个strcpy上。在它到达while循环之前

我将这个简单的行解析器放入了标记函数中……但是我缺少一些东西。 int parse_line(char * line,char ** words){int wordc = 0; / *获取第一个标记* / char * word = strtok(line,“ ...

c segmentation-fault malloc strtok
3个回答
2
投票
while( word != NULL ) {
    word = strtok(NULL, " ");
    words[wordc]=(char*)malloc(256*sizeof(char));
    strcpy(words[wordc++],word );
}

1
投票

以下建议的代码:


0
投票

您的答案是正确的!但是由于读取,我再次出现了segF!我没有注意到,当我运行程序时,它并没有停止读取read的输入!相反,它通过了。我所做的是我将读取内容更改为fgets,并且有效!随着你的变化!有人可以向我解释吗???为什么它不止于读取功能?

© www.soinside.com 2019 - 2024. All rights reserved.