2013-10-29 74 views
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; 
} 

我不知道這是爲什麼在虛空分配erorr- 22種不兼容的類型*爲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

我建議「字[我++] =的strdup(字);」而不是malloc和strcpy。 –

回答

5

而不是

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

你需要得到適當的指數words和分配這一點。

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

你還沒有嘗試嘗試令牌進行比較。一旦你展示了你所嘗試過的東西(或者在你嘗試之後),我們將會提供幫助。

+0

現在我得到了錯誤22無效轉換從'void *'到'char *'。 –

+0

@ user2883601可能是因爲您正在編譯C++編譯器?在C中,'void *'可以隱式轉換爲任何其他數據指針(不需要任何轉換)。因此,您不應該看到錯誤(或警告)消息。 –

+0

@clcto我編寫了比較令牌的代碼,你能幫助什麼是錯誤的? –

3

變化

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

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

目前,你分配malloc分配值到陣列本身,而是你打算把它分配給數組的元素

如果你有strdup()(一個posix函數,而不是標準C),那麼你可以使用它來代替malloc()+ strlen()組合,並且不太容易出錯。

我也建議使用i++作爲一個單獨的語句,以避免在未來的任何錯誤(你有什麼是沒有錯的,只是一般的建議)。

1

char * words[200]char * s的200個元素的陣列。

數組是靜態的,所以words=malloc(strlen(word)+1);沒有意義。單詞是一個指針數組,但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]);