【问题标题】:C removing array elem, program stopsC删除数组元素,程序停止
【发布时间】:2015-03-07 21:28:11
【问题描述】:

好的,所以我正在尝试制作一个类似于数据库的简单 C 程序,这意味着在数组中添加元素。由结构组成的静态数组:

typedef struct {
    int id;
    char name[20];
    char active[20];
    int quantity;
} Medicine;

接下来的 2 个在另一个模块中

typedef Medicine ElemType;

typedef struct {
    int len;
    ElemType medList[30];
} StaticList;

好的,一切都很好,直到我尝试创建一个函数来从这个基于名称的静态数组中删除一个元素。就像 used 给了我一个名字一样,我删除了名字与给定的元素匹配的元素。

void removeElem(StaticList *l, char* value) {
    int k;
    k = l->len;
    int i = 0;
    while (1) {
        Medicine m = get(l, i);
        if (strcmp(m.name, value)==0) {
            int j = i;
            for (j = i; j<k-1; j++) {
                l[j] = l[j+1];---changed to ->> l->medList[j] = l->medList[j+1];
            }
            (*l).len--;
            break;
        }
        i++;
        if (i == k-1) {
            break;
        }
    }
}

问题?我的程序具有以下功能: - 添加元素 - 列出所有元素 -删除元素

如果我添加 1 个元素,那么我将其删除...我的列表应该是空的,对吗?好吧,我的被填满了。当我尝试添加另一个元素时,我的程序崩溃了,为了找出发生了什么以及我的列表有多长......我在清空列表后进行了打印,它显示“4406168 Elems added”。 所以基本上我从 0 开始,添加 1 个元素,尝试删除它,我的数组又被 4406168 填充?发生了什么事?

如果需要更多信息,我会提供任何信息。谢谢。

【问题讨论】:

  • 输入removeElem()时你的列表长度是否等于1?如果是这样,您需要正确考虑当您到达指令i++; if (i == k-1) { ... } 时会发生什么。此外,(*l).len-- 很奇怪。请改用l-&gt;len--
  • 在 C 中,我认为数组从 0 开始。就像...如果我有 1 个元素,长度为 1,但位置为 0。所以 k=1(长度),i = 0(位置)当我有 1 个元素时。我尝试更改为 l->len-- 但它仍然在我的测试中崩溃......:/它填满了我的数组,我不知道为什么。
  • 是的,但i 不为零。不是在你增加它之后。

标签: c arrays eclipse crash


【解决方案1】:
typedef struct{
    int len;
    int a[10];
} List;

void removeElem(List& list, const int val)
{
    int i = 0;
    while(i < list.len){

        if(list.a[i] == val){ // if match
            // copy values forward
            for(int j=i+1;j<list.len;++j){
                list.a[j-1] = list.a[j];
            }
            --list.len;
        }
        ++i;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2021-11-20
    • 2013-03-27
    相关资源
    最近更新 更多