我有一个链表,我需要根据某些标准只计算一些记录。我有这个代码。
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 :(得分: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
复制到本地变量。