我有一个方法可以在表格中添加一个条目。这些条目是人们的姓名和地址。
int rtable_add(RESIZABLE_TABLE * table, char * name, void * value) {
table->array[table->currentElements].name = strdup(name);
table->array[table->currentElements].value = value;
table->currentElements++;
int i = 0;
for(i = 0; i < table->currentElements;i++) {
if(strcmp(table->array[i].name, name) == 0) {
table->array[i].value = value;
}
}
return 0;
}
但是,如果我再次将相同的名称传递给方法但传递不同的地址,它应该使用新的地址更新旧条目的地址(即值)但不应将其视为一个完整的新条目。例如,
如果我提供一组条目 -
1)乔治“126 Vine Street”
2)Ashley“889 Vine Street”
3)乔治“556 Vine Street”
程序应该只更新George的地址(即值),但不应在表中添加另一个重复的条目。
我的代码的问题是,我这样做的方式,这就是它给我的东西 -
---我正在做什么---
1)乔治“556 Vine Street”
2)Ashley“889 Vine Street”
3)乔治“556 Vine Street”
- EXPECTED -
1)乔治“556 Vine Street”
2)Ashley“889 Vine Street”
答案 0 :(得分:1)
问题在于开始。您首先创建一个新条目,将其添加到表中,然后修改循环中的现有条目。我建议先搜索匹配的条目,如果没有找到任何内容,只建议添加一个。
运行代码时发生的情况是,创建条目#3并将其添加到表中,然后在for循环中修改条目#1。
答案 1 :(得分:1)
在分配之前移动 for loop :
int i = 0;
for(i = 0; i < table->currentElements;i++) {
if(strcmp(table->array[i].name, name) == 0) {
table->array[i].value = value; //change the value
return 0; //dont add a new one
}
}
table->array[table->currentElements].name = strdup(name);
table->array[table->currentElements].value = value;
table->currentElements++;
瓦尔特
答案 2 :(得分:0)
您的代码所做的第一件事就是将传递的名称和值作为数组末尾的新条目插入:
table->array[table->currentElements].name = strdup(name);
table->array[table->currentElements].value = value;
接下来要做的是通过表查找具有相同名称的任何项目,并将其值设置为传入的值,在您的示例中将更新原始条目和函数刚才坚持到底:
int i = 0;
for(i = 0; i < table->currentElements;i++) {
if(strcmp(table->array[i].name, name) == 0) {
table->array[i].value = value;
}
}
顺便说一句,你是strdup()的名字,但不是价值。我不知道这是否是故意的。