【问题标题】:Preventing duplicate entry from being added (C program)防止添加重复条目(C程序)
【发布时间】:2014-09-21 08:16:21
【问题描述】:

我有一个向表中添加条目的方法。条目是人员的姓名和地址。

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 号”

2) 阿什莉“藤街 889 号”

3) 乔治“藤街 556 号”

程序应该只更新 George 的地址(即值),但不应该在表中添加另一个重复条目。

我的代码的问题是,我这样做的方式,这就是它给我的 -

---我得到了什么---

1) 乔治“藤街 556 号”

2) 阿什莉“藤街 889 号”

3) 乔治“藤街 556 号”

--预期--

1) 乔治“藤街 556 号”

2) 阿什莉“藤街 889 号”

【问题讨论】:

标签: c arrays


【解决方案1】:

在赋值之前移动 for 循环

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】:

    问题出在开头。您首先创建一个新条目,将其添加到表中,然后在循环中修改现有条目。我建议先搜索匹配的条目,如果找不到任何内容,则仅添加一个新条目。

    运行代码时发生的情况是,条目 #3 被创建并添加到表中,然后条目 #1 在 for 循环中被修改。

    【讨论】:

      【解决方案3】:

      您的代码要做的第一件事是将传递的名称和值作为新条目插入到数组的末尾:

      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() 的名字,但不是价值。不知道是不是故意的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多