gpt4 book ai didi

c - C中的指针数组实现

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:18 25 4
gpt4 key购买 nike

你好,

我一直在尝试编写一个程序...我们有一个结构,它有一个等级字段和一个名称字段。指向这个结构的指针存储在一个固定大小的数组中。我已经按如下方式实现了它,但我遇到了某些问题......我写的代码是:

 #include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct
{
int rank;
char *name;
}node;

int insert(node **a , char name[] , int *rank)
{
if(*rank >= 5)
{
printf("\n Overflow ");
return 0;
}
(*rank)++;
node *new = (node *)malloc(sizeof(node));
new->name = name;
new->rank = *rank;
a[*rank] = new;

return 0;
}

int delete(node **a , int *rank)
{
int i = *rank;
if(*rank<0)
{
printf("\n No elements");
return 0;
}
printf("\n Deleting %d , %s ",((a[*rank]))->rank,((a[*rank]))->name);
printf("\n Reordering the elements ");
while(i<5)
{
a[i] = a[i+1];
}
return 0;
}

int display(node **a , int rank)
{
while(rank>0 && (a[rank])>0)
{
printf(" rank = %d name = %s \n",((a[rank])->rank),((a[rank])->name));
rank--;
}
return 0;
}

int main()
{
node *a[5] = {NULL};
char ch = 'y';
int choice,rank = -1;
char name[10];
while(ch!='n' || ch!= 'N')
{
printf("\n Enter 1 to insert , 2 to delete , 3 to display and 4 to exit \n");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\n Enter name to insert");
gets(name);
insert(a,name,&rank);
break;
case 2:
printf("\n Enter rank to delete ");
scanf("%d",&rank);
delete(a,&rank);
break;
case 3:
display(a,rank);
break;
case 4:
exit(0);
default:
printf("\n Invalid choice...please enter again ");
break;
}
ch = getchar();
}
return 0;
}

首先,除了第一次之外,系统会自动进行选择……(我找不到那里的错误……)我对这个指针的东西有点困惑……请看看它是否好吧...欢迎任何更正,请给我一些解释为什么它是错误的以及我们应该如何做...

谢谢

最佳答案

首先,您所有的函数总是返回 0 —— 即使是在错误情况下。如果您将排名作为 int 传递并返回它的新值,生活会容易得多。

rank = insert(a, name, rank); 
/* : */
/* : */
int insert(node **a , char name[] , int rank)
{
if(rank >= 5)
{
printf("\n Overflow ");
return 0;
}
rank++;
node *new = (node *)malloc(sizeof(node));
new->name = name;
new->rank = rank;
a[rank] = new;
return rank;
}

我上次使用 scanf 已经很多年了,但我记得,你必须考虑到流中的每个字符,意思是,“不要忘记回车”。

scanf("%d\n",&choice);  

还有 gets(name);,如果你输入超过 9 个字符,你就完蛋了,因为它会覆盖你的程序堆栈。

更新:此外,您有两种方法可以退出该程序,但其中一种永远行不通。您可以选择将调用 exit(0) 的选项“4”。或者,在每个命令的末尾,您在跳过之前等待一个字符。看来您希望能够在那里输入“N”然后退出,但这是行不通的:

while(ch!='n' || ch!= 'N') 

要将其计算为假,ch 必须同时为“n”和“N”。你真的想要

while(ch!='n' && ch!= 'N') 

更新 2: 我刚刚注意到你代码中最大的问题。 name 代码中的所有地方都只指向 main() 中定义的单个数组。每次输入新名称时,它都会覆盖该数组,并且由于每个节点都指向该数组,因此名称会随处更改。你需要复印一份。在插入()中:

node *new = (node *)malloc(sizeof(node));     
new->name = strdup(name); // use malloc internally.

然后在 delete() 中,您必须释放该内存(说到这里,您也需要在那里释放节点...)

printf("\n Deleting %d , %s ",((a[*rank]))->rank,((a[*rank]))->name);       
free(a[*rank]->name);
free(a[*rank]);
printf("\n Reordering the elements ");

请记住,无论何时调用 malloc,最终都必须调用 free

关于c - C中的指针数组实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3468656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com