2015-04-07 61 views
0

這可能是一個壞問題,但我完全失去了。我有這樣的代碼:在列表中搜索節點兩個作品並不起作用

struct nodoTemas* search_in_list(char * val, struct nodoTemas **prev,struct nodoTemas *head/*, struct nodoTemas *curr*/) 
{ 
struct nodoTemas *ptr = head; 
struct nodoTemas *tmp = NULL; 
bool found = false; 

printf("\n Searching the list for value [%s] \n",val); 

while(ptr != NULL) 
{ 
    if(ptr->nombreTema == val) 
    { 
     found = true; 
     break; 
    } 
    else 
    { 

     tmp = ptr; 
     ptr = ptr->next; 
    } 
} 

if(true == found) 
{ 
    if(prev) 
     *prev = tmp; 
    return ptr; 
} 
else 
{ 
    return NULL;//si no ha encontrado nada devuelve NULL 
} 

}

我測試了一下,在一個特定的文件來測試它,就像這樣:

char * var="tema1"; 
char * var2="tema2"; 
head=add_to_list(var,true,head,curr); 
curr=head; 
curr=add_to_list(var2,true,head,curr); 
struct nodoTemas* nodoBuscado; 
char *temaABuscar="tema4"; 
nodoBuscado=search_in_list(temaABuscar, NULL,head); 

if(nodoBuscado!=NULL) 
    printf("VALOR DEL NODO %s\n",nodoBuscado->nombreTema); 

而且這工作完全正常,無論我做什麼。如果我查找存在的東西,就會打印它等等。現在在我的主文件中,我得到了char *我的服務器從消息中獲取了char *。我認爲這失敗了,所以我嘗試了幾件事情,這是其中之一:

printf("MATCH %d \n" , strcmp(temaRecibido,head->nombreTema)); 

我得到一個0作爲結果。所以字符串是一樣的。但搜索失敗,在這個其他文件。我已經打印出來了,我已經檢查過它們的大小,而且都匹配。

所以我相信我看着錯誤的一面,但我不明白爲什麼在一個地方工作的代碼不能在其他地方工作。我應該在其他地方尋找錯誤嗎?此外,如果我做了一個字符串WITH NULL和一個沒有null的strlen,他們是相同的大小?男人說它排除了終止字節,但我不確定這一點。

對不起,如果該職位缺乏我不知道如何正確地呈現它。

+1

我會想,知道'add_to_list'的作用(而不是要求我們信任它的同名)會與你的問題相關。另外,在聲明「它工作得很好」之前,尋找已知爲*的列表中的某些東西,而不是清楚地*不是*是否具有建設性。 – WhozCraig

+1

在C中,通常不會比較「字符串」和「==」。你使用'str * cmp()'或其他類似的函數。否則,你只是比較字符串開始的內存地址... – twalberg

+0

存在許多問題。我不認爲這是正常運行。 – BLUEPIXY

回答

1

如果搜索字符串中,你不能比較字符串像

if(ptr->nombreTema == val) 

您應該使用STRCMP

if(strcmp(ptr->nombreTema, val) == 0) 
+0

你完全正確。我很慚愧地說,這不是我犯了同樣錯誤的時間。我在其他地方使用相同的代碼卻沒有。非常感謝。 – keont

1

林不知道,如果你可以在C這種方式比較字符串... 「 tema1「而不是指向」tema1「的指針是什麼結果? 也請檢查此http://www.wikihow.com/Compare-Two-Strings-in-C-Programming

+0

是的,我已經多次犯過這個錯誤,看起來好像需要一段時間才能把它弄清楚,這是正確的。 – keont