计算链表中的对象

时间:2014-04-24 16:21:55

标签: c

我有一个链表,我需要根据某些标准只计算一些记录。我有这个代码。

   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;

问题是它在行标准=(重新>标准)时给了我这个错误; 错误:无效的数组赋值

有什么想法吗?

感谢。

7 个答案:

答案 0 :(得分:1)

你有char的数组。要复制或比较数组,您需要分别复制/比较每个元素,而不是一次性在整个数组上使用=和==。 而不是制作循环,在这种情况下你可以使用strcpy和strcmp:

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

顺便说一下,这比C ++更多。如果你想要一个类似C ++的解决方案,请参阅std :: string(那么你也可以使用=和==)

答案 1 :(得分:0)

您需要使用memcpy来复制数组,但在公共接口上公开时要小心使用memcpy。我认为有一个recent security issue involving this...

答案 2 :(得分:0)

实际上,您无法使用=复制数组。你也不能用==来比较它们。它们是非常奇怪,不友好的东西,需要一定的照顾才能使用。

如果要使用数组,可以使用C库对它们进行比较:

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

由于这是C ++,您可能更喜欢使用std::string来表示字符串;那就是

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

如果需要,您可以使用=复制它(虽然您不需要在此处)。

答案 3 :(得分: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是您的朋友,您可以使用=进行作业并使用==进行比较。

答案 4 :(得分:0)

在C ++中,您可以而且应该使用std::string来处理字符串。您可以找到参考(here)。

只需将criteria定义为std::string criteria;,而不是char criteria[20];

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

答案 5 :(得分: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作为全局变量,这使得代码更可靠,更容易理解。

答案 6 :(得分:-1)

当您开始使用该语言时,处理C中的字符串是一种巨大的痛苦。您可以结帐an online tutorial以开始使用。

同时,您可以将代码更改为:

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

您无需将re->criteria复制到本地变量。