我有一个链表和一个setter函数。
struct my_struct {
int value;
int type;
char *name;
struct my_struct *next;
};
struct my_struct *setValue(struct my_struct *s, char *name, int b) {
if(s!=NULL) {
while(s != NULL) {
if( strcmp(s->name,name) == 0) {
s->value = b;
}
s=s->next;
}
return s;
}
return NULL;
}
此处,name是搜索关键字,b是s-> value的新值。为什么s->值不能改变?在那个函数之后,输出很奇怪。我无法理解,发生了什么。
答案 0 :(得分:2)
您需要使用strcmp
测试字符串的相等性,如下所示。在您的代码中,您正在测试两个指针是否相等 [related post] 。
#include <string.h>
if(strcmp(s->name, name) == 0) { // if both strings are equal
s->value = b;
}
您的退货声明的位置很有趣。您将返回已更改的最后一个项目的地址,这可能是不受欢迎的。
根据@Matthew Iselin的评论,将您的循环更改为以下内容:
while(s != NULL) {
...
}
如果您将根节点设置为函数的返回值,则在循环链接列表后s
将始终为NULL
,因此该函数将始终返回NULL
答案 1 :(得分:1)
答案 2 :(得分:0)
你已经获得了关于循环的帮助,所以我会尝试留下什么。
您确定s-&gt;名称和名称都已正确分配内存吗?并且两者都是相同的长度并且正确地终止。 strcmp()
函数表示所有这些都是真的,可以给出equal
响应,并为任何响应分配内存和空终止。
如果你的结果很有趣,可能会有某些内存泄漏。尝试使用最大字符数的strncmp
进行比较,看看会发生什么。