c - 将字符串与链表数据元素进行比较时,strcmp 不会返回 0

标签 c linked-list strcmp

我在使用链表程序时遇到一些问题,其中 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);

您将获得预期的输出。

调试输出

当使用正确的顺序时,调试控制台中的输出看起来像预期的值:

debug output

关于c - 将字符串与链表数据元素进行比较时,strcmp 不会返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986689/

相关文章:

crypt 函数和链接错误 "undefined reference to ' crypt'"

c++ - 神奇分配的链表中的头指针,不应该工作但确实如此

C:将二维数组分配给另一个数组

C - 大小为 1 的无效读取

c - GCC 链接器无法找到库

c++ - extern "C"函数内部使用C++类

java - 在 while 循环中达到条件时始终为真

c++ - 关于如何实现的想法?

c++ - 如何计算相同的累计金额

c - 从标准输入 c 传入文件时运行 gdb