Проблемы с strcmp и элементом структуры в C - PullRequest
0 голосов
/ 18 марта 2020

Я сравниваю строку, взятую при вводе обычным scanf, со строкой в ​​структуре. Это структура:

typedef struct{     // Tipo giocatore e i suoi dati
        int id;
        char * nome;
        char * cognome;   //<--------- this one (it means surname)
        int eta;
        char * ruolo;
        squadra team;
        char * college;
        int td;
    } giocatore;

И это код, который работает и не работает (?.?). Я не знаю, почему иногда это работает, а иногда нет, потому что это второй случай коммутатора, который имеет тот же код, что и первый, но со словом «имя» вместо «фамилия». Помните, что первый случай работает каждый раз, второй - выбор (смеется), а последний (третий) содержит первую проблему, которую я объяснил ранее.

size_t ricerca(short int tipo, size_t sz, giocatore array[]){
    size_t count = 0;
    char cerca;
    switch(tipo){
    case 1:
        printf ("Inserisci il nome da cercare: ");
        scanf ("%s", &cerca);
        for (size_t i = 0; i < sz; ++i){
            if (strcmp(array[i].nome, &cerca) == 0){
                printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
                    array[i].id,
                    array[i].nome,
                    array[i].cognome,
                    array[i].eta,
                    array[i].ruolo,
                    array[i].team.nome,
                    array[i].college);
                count++;
                    }
        }
        break;
    case 2:
        printf ("Inserisci il cognome da cercare: ");
        scanf ("%s", &cerca);
        for (size_t i = 0; i < sz; ++i){
            if (strcmp(array[i].cognome, &cerca) == 0){
                printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
                    array[i].id,
                    array[i].nome,
                    array[i].cognome,
                    array[i].eta,
                    array[i].ruolo,
                    array[i].team.nome,
                    array[i].college);
                count++;
                    }
        }
        break;
    case 3:
        goto Cleanup;
        Cleanup: ;
        char nomesq[30];
        printf ("Inserisci il nome della squadra da cercare: ");
        scanf("%[^\n]%*c", nomesq);
        for (size_t i = 0; i < sz; ++i){
            if (strcmp(array[i].team.nome, nomesq) == 0){
                printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
                    array[i].id,
                    array[i].nome,
                    array[i].cognome,
                    array[i].eta,
                    array[i].ruolo,
                    array[i].team.nome,
                    array[i].college);
                count += 1;
                    }
        }
        break;
    default:
        printf("Inserisci un valore valido\n;");
        break;
    }
    return count;
}

Заранее благодарим за ваше терпение и Ваша помощь и извините за мой английский sh:)

1 Ответ

2 голосов
/ 18 марта 2020

«иногда это работает, иногда нет». Я не проверял, но это означает неопределенное поведение . И одно явное неопределенное поведение таково:

char cerca;

, тогда это:

scanf ("%s", &cerca);

это сканирование cerca в качестве указателя на символы . Но не хватает места даже для 1 символа (плюс нулевое завершение). Это ужасная ошибка, так как она даже не вызывает предупреждение (тип &cerca равен char * в порядке).

Быстрое исправление:

char cerca[100];

, затем

scanf("%99s",cerca);

и замените &cerca на cerca в остальной части кода (часть strcmp также обязательно должна включать предупреждения). Это безопасно и будет усечено, если строка слишком велика. Нет переполнения, нет неопределенного поведения.

...