strcmp не возвращает 0 при сравнении строки с элементом данных связанного списка

У меня возникли проблемы с программой связанного списка, в которой strcmp никогда не возвращает 0, однако они равны. Я попробовал функцию strcpy(), чтобы поместить temp -> name в строку, но это тоже не сработало. Я пытаюсь присвоить среднее значение температуре -> среднее.

Вот ввод:

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;
}

person Zsolti    schedule 04.05.2019    source источник
comment
Какое определение для struct student? Какой результат вы получаете сейчас?   -  person Yakov Galka    schedule 04.05.2019
comment
Когда вы делаете temp -> average = average, значение avarage неопределенно. Вы никогда не присваиваете значение avage,   -  person Some programmer dude    schedule 04.05.2019
comment
@Someprogrammerdude сканф?   -  person Antti Haapala    schedule 05.05.2019
comment
scanf("%s %s %lf", firstname, lastname, &average); не соответствует вводу - куда делся vloz?!   -  person Antti Haapala    schedule 05.05.2019
comment
Пожалуйста, опубликуйте код для функций синтаксического анализа.   -  person chqrlie    schedule 05.05.2019


Ответы (2)


Вы поменяли имя и фамилию, поэтому сравнение не работает.

Во влозе это выглядит так:

scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);

А в zmen первым элементом scanf является фамилия:

scanf("%s %s %lf", lastname, firstname, &average);

Если поменять порядок в zmen, чтобы было так:

scanf("%s %s %lf", lastname, firstname, &average);

вы получите ожидаемый результат.

Вывод отладки

При использовании правильного порядка вывод в консоли отладки выглядит как ожидаемые значения:

вывод отладки

person Stephan Schlecht    schedule 04.05.2019

В опубликованном коде есть некоторые проблемы, но ничего, что объясняет ваши наблюдения.

Проблема должна быть где-то в другом месте, в функциях, которые вы написали для разбора файла и создания списка. Разместите полный код работающей программы, которая демонстрирует неожиданное поведение.

Вот некоторые проблемы в вашем коде:

  • Вы всегда должны проверять возвращаемое значение scanf(), чтобы обнаружить неверный ввод или конец файла.
  • Вы должны удалить завершающую новую строку в scanf("%s %s %d %lf\n", firstname, lastname, &year, &average);. Это заставляет scanf() продолжать чтение, пока не получит непустой ввод.
  • Вы должны защитить от переполнения буфера при чтении строк с помощью:

    scanf("%49s %49s %lf", lastname, firstname, &average);
    
  • тест if (head->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;
}
person chqrlie    schedule 04.05.2019