Я пишу 8-й день из 30-ти дней кода в HackerRank, и у меня проблема с strcmp. Код запрашивает у пользователя имена людей и их номера, затем запрашивает другие имена, если имя не было ...

0
Andre 23 Янв 2021 в 17:53

2 ответа

Лучший ответ

Вы не нашли othernames от начала до конца, чтобы каждый раз сравнивать people, поэтому вам нужно заменить

for (i = 0; i < n; i++) {
  if (strcmp(othernames[i], people[i].name) == 0) {
    printf("%s=%i\n", people[i].name, people[i].number);
  } 
  else {
    printf("Not found\n");
  }
}

К

bool found = false;
for (i = 0; i < n; i++) {
  for ( j = 0 ; j < n ; j++ ) {
    if (strcmp(othernames[j], people[i].name) == 0) {
      printf("%s=%i\n", people[i].name, people[i].number);
      found = true;
    } 
  }
}

if ( found == false ) printf("Not found\n");
0
Itati 23 Янв 2021 в 16:14

Проблема в том, что othernames должен быть просто массивом char, а не матрицей. И для каждого введенного имени вы должны сканировать всю телефонную книгу, чтобы найти его или отобразить Not found. В соответствии с кодировкой вы проверяете, соответствует ли i-е введенное другое имя i-й записи в телефонной книге.

Вот модифицированная версия:

#include <stdio.h>
#include <string.h>

typedef struct {
    char name[100];
    int number;
} phonebook;

int main() {
    int n = 0;
    do {
        if (scanf("%i", &n) != 1)
            return 1;
    } while (n < 1 || n > 100000);
    
    phonebook people[n];
    
    for (int i = 0; i < n; i++) {
        if (scanf("%99s %i", people[i].name, &people[i].number) != 2)
            return 1;
    }
    
    for (int i = 0; i < n; i++) {
        char othername[100];
    
        if (scanf("%99s", othername) != 1)
            break;
    
        int j;
        for (j = 0; j < n; j++) {
            if (strcmp(othername, people[j].name) == 0) {
                printf("%s=%i\n", people[i].name, people[i].number);
                break;
            }
        }
        if (j == n) {
            printf("Not found\n");
        }
    }
    return 0;
}

Обратите внимание, что, вероятно, не рекомендуется хранить телефонные номера как значения int. Лучше использовать массив char, чтобы начальное значение 0 было значимым и для хранения более длинных чисел.

0
chqrlie 23 Янв 2021 в 16:09