从C中的数组中删除元素

时间:2015-11-12 19:26:10

标签: c arrays

我一直用C制作电话簿,但我的删除选项有问题。

例如,我的电话簿包含

  1. 添加名称
  2. 显示名称
  3. 删除姓名(省略其他选项,如电话号码,地址等)
  4. 当我使用3 rd 选项删除联系人并转到2 nd 时,会显示一个包含我已保存名称的列表但没有我删除的名称。但这让我重复了最后的立场。

    以下是代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    
    char name[5][20];
    char aux[20];
    int position;
    int op;
    
    
    void menu();
    void add();
    void show();
    void show_remove();
    //void remove();
    void pause();
    
    
    int main() 
    {
    menu(); 
    
    return 0;
    }
    
    
    void menu()
    {
    do{
    
    system("clear");
    
    printf("\tMAIN MENU\n\n");
    
    printf("Choose one of the next options: \n\n");
    
    printf("1.....Add a name\n");
    printf("2.....Show the names in the register\n");
    printf("3.....Delete a name on the register\n");
    printf("4.....Exit\n");
    printf("Choose your option: ");
    scanf(" %i", &op);  
    
    system("clear");
    
    switch(op)
    {
        case 1:
        add();
        break;
    
        case 2:
        show();
        break;
    
        case 3:
        show_remove();
        break;
    
        case 4:
        printf("\nEnd of the program");
        pause();
    
        }
    
    
        }while(op!=4);  
    
    }
    
    
    
    void pause()
    {
        printf("\n\nPress ENTER to continue\n");
        getchar();
        getchar();
        }
    
    
    
    void add()
    {
        printf("\tADD THE NAMES\n\n");
    
        for(int i=0; i<5; i++)
        {
            printf("Name in [%i]: ", i);
            scanf(" %[^\n]", name[i]);
            }
    
            pause();
        }   
    
    
    
    void show_remove()
    {
        int i,j,x;
    
        for(i=0; i<5-1; i++)
            {
                for(j=i+1; j<5; j++)
                {
                x=strcmp(name[i], name[j]);
                if(x>0)
                {
                    strcpy(aux, name[i]);
                    strcpy(name[i], name[j]);
                    strcpy(name[j], aux);                       
    
                    }
                    }
                }
    
    
        printf("\tADDED NAMES\n");
    
        for(i=0; i<5; i++)
        {
            printf("\nName in [%i]: %s", i, name[i]);
            }
    
    
            printf("\n\n'1' yes, '0' no.");
            printf("\nDo you want to delete an element from array? 1/0:");
            scanf(" %i", &op);
    
            if(op==1)
            {
            printf("\n\nAdd the index that you wish to delete: ");
        scanf(" %i", &position);
    
    
    
        if(position>=5)
        {
            printf("Can't be deleted!");
            }
    
    
        else
        {
        for(i=position; i<5-1; i++)
        {
                x=strcmp(name[i], name[i+1]);
                if(x<0)
                {
                    strcpy(name[i], name[i+1]);
                    }
                }
    
    
    printf("\nArray after the elimination: \n");
    for(i=0; i<5-1; i++)
    {
        printf("\nElementsof the array [%i]: %s", i, name[i]);
            }
            pause();
            }
        }
    
    
    
        else
        {   
        pause();
            }
    
        }
    
    
    
    void show()
    {
        printf("\tADDES NAMES\n\n");
        {
            for(int i=0; i<5; i++)
            {
            printf("\nElements of the array [%i]: %s", i, name[i]);
                }
            }
            pause();
    
    
        }
    

2 个答案:

答案 0 :(得分:2)

它重复了最后一个位置,因为这正是你告诉它要做的。您正在通过将删除的一个元素复制到一个位置后删除所有元素。但是您将原始副本留在最后一个插槽中。你需要用空字符串填充它。或者只列出4个插槽,正如@kevin在评论中建议的那样。

答案 1 :(得分:0)

尝试获取有关strcmp库函数here的更多信息。
您还可以提供一些用户定义的字符串来描述到达目的地。

要么
你应该按照删除减小大小,这样就不会因为任何垃圾值/删除值而重新出现最后一个。 这样做将消除无法检测到相同字符串比较的可能性,并使您的程序正常运行。