【问题标题】:strcmp won't return 0 when comparing string to a linked list data element将字符串与链表数据元素进行比较时,strcmp 不会返回 0
【发布时间】:2019-05-04 20:51:42
【问题描述】:

我在一个链表程序中遇到了一些问题,其中 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;
}

【问题讨论】:

  • struct student的定义是什么?你现在得到的输出是什么?
  • 当您执行temp -&gt; average = average 时,avarage 的值是不确定的。你永远不会给avage赋值,
  • @Someprogrammerdude scanf?
  • scanf("%s %s %lf", firstname, lastname, &amp;average); 与输入不匹配 - vloz 去哪儿了?!
  • 请把解析函数的代码也贴出来。

标签: c linked-list strcmp


【解决方案1】:

您切换了名字和姓氏,因此比较不起作用。

在 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);

你会得到预期的输出。

调试输出

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

【讨论】:

    【解决方案2】:

    发布的代码存在一些问题,但无法解释您的观察结果。

    问题一定出在其他地方,在您为解析文件和构造列表而编写的函数中。将完整代码发布到表现出意外行为的工作程序。

    以下是您的代码中的一些问题:

    • 您应该始终检查scanf() 的返回值,以检测文件结尾的无效输入。
    • 您应该删除scanf("%s %s %d %lf\n", firstname, lastname, &amp;year, &amp;average); 中的尾随换行符,这会导致scanf() 继续读取,直到它得到非空输入。
    • 在读取字符串时应防止缓冲区溢出:

      scanf("%49s %49s %lf", lastname, firstname, &average);
      
    • 测试if (head-&gt;first != NULL) { struct database *head = create_head(); } 没用:如果列表不为空,则将新树分配给立即超出范围的新局部变量。

    • 您没有在扫描功能中正确比较名称。

    • 请为您的函数使用英文名称,je ne comprends pas le slovaque。

    这是修改后的版本:

    #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(void) {
        struct database *head = malloc(sizeof(struct database));
        head->first = NULL;
        return head;
    }
    
    void vloz(struct database *head) {
        struct student *temp = malloc(sizeof(struct student));
        if (temp == NULL) {
            printf("out of memory\n");
            return;
        }
    
        char firstname[50];
        char lastname[50];
        int year;
        double average;
        if (scanf("%49s %49s %d %lf", firstname, lastname, &year, &average) != 4) {
            printf("invalid input\n");
            return;
        }
        strcpy(temp->firstname, firstname);
        strcpy(temp->lastname, lastname);
        temp->year = year;
        temp->average = average;
        temp->next = head->first;
        head->first = temp;
    }
    
    void zmen(struct database *head) {
        char firstname[50];
        char lastname[50];
        double average;
    
        if (scanf("%49s %49s %lf", firstname, lastname, &average) != 3) {
            printf("invalid input\n");
            return;
        }
    
        struct student *temp = head->first;
        while (temp != NULL) {
            if (strcmp(temp->firstname, firstname) == 0
            &&  strcmp(temp->lastname, lastname) == 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("%19s", prikaz) == 1) {
            if (strcmp(prikaz, "vloz") == 0)
                vloz(head);
            else
            if (strcmp(prikaz, "vypis") == 0)
                vypis(head);
            else
            if (strcmp(prikaz, "zmen") == 0)
                zmen(head);
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多