我需要将令牌存储到数组中。然后我想在句子中找到相同的代币。
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");
}
}
}
答案 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]);