关于c中的标记化的问题

时间:2015-04-28 19:06:31

标签: c

我正在写一个令牌化程序。我想从文件中获取输入,然后将其存储在输入指针中。我正在使用strtok函数,但是当我打印我的标记[i]时,我得到了NULL。

 int tokenise(char *input, int file_output)
 {
     int i = 0;
     char *tokens[100];
     for(i=0 ;i<=20;i++)
     {
         tokens[i]= (char*)malloc(sizeof(char*));
     }

     char delim[] = " ,.;@/";
     printf("\n -------------  buffer data is %s",input);
     tokens[i] = strtok(input , delim);
     printf("tokens are %s",*tokens[0]);
     int j=0;

     while(NULL != tokens[i])
     {
         i++;
         tokens[i] = strtok(NULL,delim);
     }

     for(j = i; j <= 0; j--)
     {
         write(file_output,tokens[i],strlen(tokens[i]));
     }
     for(i = 0; i <= 20; i++)
     {
         printf("%s \n",*tokens[i]);
     }
     return SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

由于某种原因,您分配内存并将指针写入tokens[]的前21个元素。在该循环结束时,i为21.然后使用strtok()解析输入字符串,将其结果存储在tokens[21]的连续数组元素中。所以你的两个循环需要重写:

for(j=21; j<i; j++)
    write(file_output,tokens[j],strlen(tokens[j]));

for(j=21; j<i; j++)
    printf("%s \n",*tokens[j]);

但是如果删除分配不必要内存的第一个循环会更好。 strtok()返回指向原始字符串的指针,它通过插入'\0'终止符而分成几部分,因此您只需要将指针存储在数组tokens[]中。