将令牌存储到数组中

时间:2013-10-29 18:04:03

标签: c arrays string

我需要将令牌存储到数组中。然后我想在句子中找到相同的代币。

int main()    
{
    int i=0;
    char* words[200];
    char text[200];

    printf("Enter one sentence \n ");
    gets(text);
    char *word = strtok(text, " ");

    while(word!=0)
    {
        words=malloc(strlen(word)+1);              
        strcpy(words[i++], word);
        printf("[%s]\n", word);
        word=strtok(NULL, " ,.!?");
    }

    getch();
    return 0;
} 

我不知道为什么这个erorr-22不兼容的类型将void *赋给char * [200]' 如果我将单词改为单词[i] = malloc .....得到错误22无效转换从void *到char *'

然后我想知道如何从这个数组我可以用strcmp比较这些令牌。 这是我的尝试,但看起来不起作用。

for (k=0; k<199; k++)
{
 for (j=k+1; j<200; j++)
  { 
             if (strcmp(words[k],words[j])==0) 
             {
             printf("equal words are %d",words);
             }
             else
             {
             printf("In this sentence aren't equal words");
             }
   }

} 

3 个答案:

答案 0 :(得分:5)

而不是

words = malloc( strlen( word ) + 1 );

您需要在words中获取正确的索引并分配它。

words[i] = malloc( strlen( word ) + 1 );

您还没有尝试比较令牌。一旦你展示了你尝试过的东西(或在你尝试之后),我们会帮助你。

答案 1 :(得分:3)

更改

    words=malloc(strlen(word)+1);              

    words[i]=malloc(strlen(word)+1);              

目前,您正在将malloc'ed值分配给数组本身,而是打算将其分配给数组的元素

如果你有strdup()(posix函数,而不是标准C),那么你可以使用它而不是malloc()+ strlen()组合,而且不易出错。

我还建议使用i++作为单独的声明,以避免将来出现任何错误(你所拥有的不是错误;只是一般建议)。

答案 2 :(得分:1)

char * words[200]是一个200个元素的char * s数组。

数组是静态的,因此words=malloc(strlen(word)+1);没有意义。 words是一个指针数组,但malloc会返回void *

我认为您想要的是将变量用作迭代器 - words[i]而不仅仅是words

如果更改为words[i] = malloc(strlen(word)+1);会给您带来无效的转化错误,您可以尝试投射,但您不应该这样做,因为malloc会返回void*。要投射,请使用words[i] = (char*) malloc(strlen(word) + 1);(char*)告诉编译器即使看起来你正在进行无效转换,你也知道你正在做什么。

另外,对于尝试查找匹配字符串的第二部分,我认为对于第一个printf,你的意思是这样的: printf("Equal words are %d, %d: %s\n", j, k, words[j]);

相关问题