gpt4 book ai didi

c - 从头部删除结构(或可能重复?)打印时会产生奇怪的文本

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

我目前正在学习 C,我的任务是创建一个保存记录的结构,我应该使用链表。我的功能之一是通过输入姓氏来删除记录。使用 fgets 后代码停止工作(没有崩溃只是停止)。

struct students
{
char firstname[21];
char lastname[21];
double score;
int zip;
struct students* next;
};
struct students* head;
void add()
{
struct students* new_node=(struct students*)malloc(sizeof(struct students));
struct students *past=head;
fflush(stdin);
new_node->next=NULL;
printf("Enter data: \n");
printf("First name: ");
fgets(new_node->firstname, 21, stdin);
printf("Last name: ");
fgets(new_node->lastname, 21, stdin);
printf("Score: ");
scanf("%lf", &new_node->score);
printf("ZIP code: ");
scanf("%d", &new_node->zip);
if(head==NULL)
{
head=new_node;
return;
}
while(past->next!=NULL)
{
past=past->next;
}
past->next=new_node;
return;
}
void delrec()
{
char last[21];
printf("Enter last name: ");
fflush(stdin);
fgets(last, 21, stdin);
struct students* temp=head;
last[strcspn(last, "\n")]=0;
if(strcmp(temp->lastname, last)==0)
{
struct students *next=temp->next;
free(temp);
temp=next;
}
while(temp!=NULL)
{
if(temp->next==NULL)
{
return;
}
if(strcmp(temp->next->lastname, last)==0)
{
struct students *next=temp->next->next;
free(temp->next);
temp->next=next;
}
temp=temp->next;
}
}
int main()
{
head=NULL;
int i, x, y;
printf("Enter 5 records:\n");
for(i=0; i<5; i++)
{
add();
}
print();
printf("What would you like to do?\n");
y=1;
while(y)
{
printf("Print records (press 1)\n");
printf("Add new record (press 2)\n");
printf("Delete record (press 3)\n");
printf("Exit the program (press 0)\n");
scanf("%d", &x);
switch(x)
{
case 0:
y=0;
break;
case 1:
print();
break;
case 2:
add();
break;
case 3:
delrec();
break;
}
}
return 0;
}

虽然我不认为它与链表有关,但也许是我的输入或其他东西。

EDIT1:我发现错误是我忘记在 delrec 的 while 循环中提供 temp=temp->next;。我现在的问题是,即使我输入了准确的姓氏,它也不会删除记录/取消结构与列表的链接。我已编辑代码以显示我的进度。

EDIT2:没有什么大的理由去编辑,但只是为了不得到不需要的答案,我已经能够弄清楚如何从链表中删除结构。但是,如果我从头部删除结构,它会打印出非常奇怪的文本,再次编辑代码以显示进度。

最佳答案

fgets()也会读入结尾的 \n 。所以用

fgets(last, 21, stdin);

如果您将 "Doe" 作为输入,则存储的是 "Doe\n"

您正在将此字符串与记录末尾的 \n 进行比较。

您需要删除结尾的 \n。可以用

last[strlen(last)-1] = '\0';

编辑:作为joop指出,如果字符串为空,strlen() 可以返回 0。如果 strlen(last) 给出 0,则 last[strlen(last)-1]。如前所述,您可以使用 strcspn()而不是喜欢

last[strcspn(last, "\n")] = '\0';

strcspn(char *dest, char *src) 返回第一个参数指向的字符串的最大初始段的长度,该参数只包含 在第二个参数指向的字符串中。

另请注意,fflush(stdin) 的效果未定义。标准说(根据 this 回答),

If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

看看the问题还有this .

关于c - 从头部删除结构(或可能重复?)打印时会产生奇怪的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49994575/

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