2014-04-24 42 views
1

我有一個鏈表,我只需要根據某些條件計算一些記錄。我有這個代碼。鏈表的鏈接列表中的對象計數

int count_records() { 
    int number = 0; 
    RECORD *re; 
    char criteria[20]; 

    for (re = first; re != NULL; re = re->next) { 
     criteria = (re->criteria); 
     if(criteria=="something") 
     number++; 
    } 

    return number; } 

結構是這樣的:

typedef struct record { 
    char criteria[20]; 
    struct record *next; 
} RECORD; 

問題是,它使我對線這個錯誤標準=(重新>條件);錯誤:無效數組賦值

任何想法?

謝謝。

+0

值得一提的唯一想法是用'std :: string'替換所有'char []'。 C風格的數組真的是二等公民,並沒有價值語義。 –

+0

或者使用'!strcmp(criteria,「something」)' – Edward

+2

@Edward'strcmp'不會返回一個'bool',而是一個'int',所以使用'!'有點混淆。這裏的成語應該是'strcmp(criteria,「something」)== 0'。 (除了當然,真正的習慣用法是使用'std :: string',並且忘掉所有這些複雜情況。) –

回答

0

事實上,你不能複製使用=陣列。您也不能使用==來比較它們。他們非常奇怪,不友好的事情,需要一定的照顧才能使用。

如果你想使用數組,你可以使用C庫來對它們進行比較:

if (std::strcmp(re->criteria, "something") == 0) 

由於這是C++,你可能更願意使用std::string表示字符串;那麼它只是

if (re->criteria == "something") 

,您可以用=如果你需要(儘管你不需要在這裏)複製它。

1

你有char數組的數組。要複製或比較數組,您需要單獨複製/比較每個元素,而不是一次使用整個數組上的=和==。和
而不是使一個循環,你可以使用在這種情況下的strcpy和STRCMP:

strcpy(criteria, re->criteria); 
if(!strcmp(criteria, "something")) 

順便說一句,這是比C++更℃。如果你想要一個類似C++的解決方案,參見std :: string(然後你可以使用=和==)

+0

非常感謝。 –

+0

@DavidHolada你有答案嗎?檢查答案是否正確 – sabotero

0

如果你想複製char數組到另一個,你需要使用strcpy。例如:

// will copy from array1 to array2 
strcpy(array2, array1); 

你不能直接做array1 = array2。因爲在這種情況下,你會操作數組的地址(char *)而不是它們的值。


另外,爲了一個char陣列的數據進行比較,使用strcmp代替:

if(strcmp(criteria, "something") == 0) 

PS:由於您使用C++,std::string是你的朋友,您可以使用=進行分配,並使用==進行比較。

+0

'strncpy'非常危險,因爲它可以在不終止''\ 0''的情況下離開目的地。我去過的大部分地方(當我在C工作的時候)都禁止了它。 –

+0

@JamesKanze替換爲'strcpy'。謝謝。 – herohuyongtao

+1

使用'strcpy()'假定數組的內容是以空字符結尾的字符串。從這個問題來看,這是否確實如此,儘管之後與以null結尾的字符串的比較似乎暗示了這一點。 –

0

在C++中,您可以也應該使用std::string來處理字符串。你可以找到參考文獻(here)。

只要定義criteriastd::string criteria;而不是char criteria[20];

不要忘記將#include <string>添加到包含部分。

-1

在C語言中處理字符串是一個皇家的痛苦。您可以結帳an online tutorial讓你開始。

在此同時,您可以更改您的代碼:

for (re = first; re != NULL; re = re->next) { 
    if (strcmp(re->criteria, "something) == 0) 
    number++; 
} 

你不需要re->criteria複製到一個局部變量。

0

我認爲您可能希望將標準傳遞給您的count_records()函數。我想使它像這樣:

int count_records(RECORD *first, const char *criterion) { 
    int count = 0; 
    RECORD *re; 

    for (re = first; re != NULL; re = re->next) { 
     /* add to count if the strings match */ 
     if(!strcmp(criterion, re->criteria)) 
      count++; 
    } 
    return count; 
} 

注意,它也並不依賴於first是一個全局變量,這使得代碼更可靠,更容易理解。