我一直用C制作电话簿,但我的删除选项有问题。
例如,我的电话簿包含
当我使用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();
}
答案 0 :(得分:2)
它重复了最后一个位置,因为这正是你告诉它要做的。您正在通过将删除的一个元素复制到一个位置后删除所有元素。但是您将原始副本留在最后一个插槽中。你需要用空字符串填充它。或者只列出4个插槽,正如@kevin在评论中建议的那样。
答案 1 :(得分:0)
尝试获取有关strcmp
库函数here的更多信息。
您还可以提供一些用户定义的字符串来描述到达目的地。
要么
你应该按照删除减小大小,这样就不会因为任何垃圾值/删除值而重新出现最后一个。
这样做将消除无法检测到相同字符串比较的可能性,并使您的程序正常运行。