2016-05-14 217 views
0

我有使用指針2層結構沒有影響,形成一個鏈表,我創建了這些工種操作:聲明與指針

typedef struct hashtag { 
    char *text; 
    int count; 
} *Item; 

typedef struct node { 
    Item item; 
    struct node *next; 
} *link; 

我在與所有的指針一對夫婦的問題相同的功能。

/* adds hashtag (Item Type) to linked list (Link Type) */ 

void add_hashtag(char *word){ 
    int search_result, i; 
    for (i = 0; i < strlen(word); i++) 

    /* converts word to all lowercase before adding */ 

    token[i]=tolower(*(token + i)); 
    Item buffer = (Item) malloc(sizeof(struct hashtag)); 
    strcpy(buffer->text,word); 

    /* Runs through the list to see if the hashtag was already added */ 

    search_result = (search_hashtag(head, buffer)); 
    if (search_result!=NULL){ 

     /* Increase count (occurrence) of hashtag if it already exists (returns link type or NULL if not found) */ 

     increase_hashtag_count(search_result); 
    } 

    /* Create new struct type hashtag */ 
    new_hashtag(buffer); 

} 

警告:賦值時將指針整數,未作施放[-Wint轉換] search_result =(search_hashtag(頭,緩衝液));

警告:(!search_result = NULL)指針和整數 如果進行比較{

tolower()功能和search_result()不與指針正常工作,而且我無法調試這一點。

編輯:tolower()固定的,我誤讀的文檔

+0

[請參閱此討論關於爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+0

'int search_result'但它需要一個指針。 'strcpy(buffer-> text,word);':'buffer-> text'不分配。 – BLUEPIXY

回答

0

作爲每tolower()man page

返回的值是轉換後的信,或c如果轉換是不可能的。

這意味着,它不變化傳遞的參數,它return S中的結果作爲函數調用的返回值和你的情況,你忽略了返回值,使得整個函數調用毫無意義。

所以,你需要有另一個數組存儲的tolower()返回值來獲取轉換後的小寫

這就是說,對於第二種情況,您已經定義search_resultint但後來,你想它比對NULL,這是一個空指針常量。您需要相應地更正數據類型。

+0

是的,我以某種方式完全誤讀了文檔,現在我已經解決了這些問題,但搜索結果中的其他問題仍然存在 – spacing

+0

@spacing:那麼還存在什麼問題?你只能說他們'工作不正常'。 – usr2564301

+0

@RadLexus(search_hashtag)/ search_result()無法正常工作,主帖 – spacing

1

函數中有幾個錯誤。

首先,目前還不清楚什麼是可變token哪裏以及如何聲明,使用和設置

for (i = 0; i < strlen(word); i++) 

/* converts word to all lowercase before adding */ 

token[i]=tolower(*(token + i)); 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

希望檢查調用malloc是全成。例如

Item buffer = (Item) malloc(sizeof(struct hashtag)); 
if (buffer) 
{ 
    //...other stuff 
} 

buffer-> text的內存未分配。所以這個聲明

strcpy(buffer->text,word); 

有未定義的行爲。

變量search_result被聲明爲具有類型int。你應該把它與一個整數,而不是一個指針比較

search_result = (search_hashtag(head, buffer)); 
if (search_result!=NULL){ 
^^^^^^^^^^^^^^^^^^^^^^^^^ 

看來,如果主題標籤已經存在,你不應該在此聲明一個新的主題標籤添加到列表中

new_hashtag(buffer); 

這足以增加現有主題標籤的計數(發生)。

+0

相同錯誤非常好的幫助,非常感謝!關於緩衝區 - >文本分配,你可以再澄清一點嗎?通過使用'Item buffer =(Item)malloc(sizeof(struct hashtag));'我沒有爲Item.count和Item.text變量分配內存嗎? 關於search_hashtag(),如果尚未找到,則返回NULL。所以!= NULL = new_hashtag(); 但我不知道如何正確調用指針 – spacing

+0

@spacing結構hashtag有兩個數據成員計數和指針文本將指向字符串單詞,據我所知。所以你需要爲單詞的副本分配內存。例如buffer-> text = malloc(strlen(word)+ 1); 。至於函數serach_hashtag,那麼你應該確定它有什麼樣的返回類型。 –