2014-04-24 43 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是一个全局变量,这使得代码更可靠,更容易理解。