1

我需要将令牌存储到一个数组中。然后我想在句子中找到相等的标记。

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;
} 

我不知道为什么这个错误 - 将 void* 分配给 char*[200]' 时会出现 22 种不兼容的类型,如果我将单词更改为 words[i]=malloc ..... 会从 void* 得到错误 22 无效转换到 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");
             }
   }

} 
4

3 回答 3

5

代替

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

您需要获取正确的索引words并进行分配。

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

您还没有尝试尝试比较令牌。一旦您展示了您尝试过的内容(或在您尝试过之后),我们将提供帮助。

于 2013-10-29T18:10:49.393 回答
3

改变

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

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

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

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

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

于 2013-10-29T18:11:14.547 回答
1

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

数组是静态的,所以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]);

于 2013-10-29T18:11:45.180 回答