我在使用链表程序时遇到一些问题,其中 strcmp 从不返回 0,但它们是相等的。我尝试了 strcpy() 函数将 temp -> name 放入字符串,但它也没有用。我正在尝试将平均值分配给 temp -> average。
这里是输入:
vloz Mrkvicka Jozko 1 1.25
vloz Hrusticka Ferko 2 1.5
vloz Kalerab Jurko 1 2.14
vloz Hrusticka Ferko 1 2.8
vloz Zeler Misko 1 4.12
vypis
zmen Hrusticka Ferko 3.0
vypis
我的输出应该是这样的:
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=3.00 //current 2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=3.00 //current 1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
我目前的输出:
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
firstname=Zeler, name=Misko, year=1, average=4.12
firstname=Hrusticka, name=Ferko, year=1, average=2.80
firstname=Kalerab, name=Jurko, year=1, average=2.14
firstname=Hrusticka, name=Ferko, year=2, average=1.50
firstname=Mrkvicka, name=Jozko, year=1, average=1.25
这是我的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char firstname[50];
char lastname[50];
int year;
double average;
struct student *next;
};
struct database
{
struct student *first;
};
struct database *create_head ()
{
struct database *head = (struct database *)malloc(sizeof(struct database));
head -> first = NULL;
return head;
}
void vloz (struct database *head)
{
struct student *temp = (struct student *) malloc (sizeof(struct student));
temp -> next = NULL;
char firstname[50];
char lastname[50];
int year;
double average;
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
strcpy(temp -> firstname, firstname);
strcpy(temp -> lastname, lastname);
temp -> year = year;
temp -> average = average;
temp -> next = head -> first;
head -> first = temp;
return;
}
void zmen (struct database *head)
{
char firstname[50];
char lastname[50];
double average;
scanf("%s %s %lf", lastname, firstname, &average);
struct student *temp = head -> first;
while (temp != NULL)
{
if (strcmp(temp -> firstname, firstname) == 0)
{
printf("TTT\n");
temp -> average = average;
}
temp = temp -> next;
}
}
void vypis (struct database *head)
{
struct student *temp = head -> first;
while (temp != NULL)
{
printf("lastname=%s, firstname=%s, year=%d, average=%.2lf\n", temp -> firstname, temp -> lastname, temp -> year, temp -> average);
temp = temp -> next;
}
printf("\n");
}
int main()
{
char prikaz[20];
struct database *head = create_head();
while (scanf("%s", prikaz) > 0)
{
if (strcmp(prikaz, "vloz") == 0)
{
if (head->first != NULL)
{
struct database *head = create_head();
}
vloz (head);
}
if (strcmp(prikaz, "vypis") == 0)
vypis (head);
if (strcmp(prikaz, "zmen") == 0)
zmen (head);
}
return 0;
}
最佳答案
您调换了名字和姓氏,因此比较无效。
在 vloz 中它看起来像这样:
scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);
在 zmen 中,scanf 的第一个元素是 lastname:
scanf("%s %s %lf", lastname, firstname, &average);
如果你在 zmen 中切换顺序,那么它看起来像:
scanf("%s %s %lf", lastname, firstname, &average);
您将获得预期的输出。
调试输出
当使用正确的顺序时,调试控制台中的输出看起来像预期的值:
关于c - 将字符串与链表数据元素进行比较时,strcmp 不会返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986689/