【问题标题】:store tokens into array将令牌存储到数组中
【发布时间】:2013-10-29 18:04:03
【问题描述】:

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

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

我不知道为什么这个 errr- 将 void* 分配给 char*[200]' 时出现 22 种不兼容的类型 如果我将 words 更改为 words[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");
             }
   }

} 

【问题讨论】:

  • 我建议“words[i++] = strdup(word);”而不是 malloc 和 strcpy。

标签: c arrays string


【解决方案1】:

代替

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

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

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

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

【讨论】:

  • 现在我收到了错误 - 来自 void*' to char*' 的 22 无效转换。
  • @user2883601 可能是因为您使用 C++ 编译器进行编译?在 C 中,void* 可以隐式转换为任何其他数据指针(无需任何转换)。因此,您不应该看到该错误(或警告)消息。
  • @clcto 我写了代码来比较令牌你能帮忙看看有什么问题吗?
【解决方案2】:

改变

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

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

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

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

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

【讨论】:

    【解决方案3】:

    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]);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2017-09-22
      • 1970-01-01
      • 2020-03-15
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多