ошибка при сравнении строки в структурах с введенными строками - PullRequest
0 голосов
/ 21 июня 2020

Я ввожу действительное имя Steve xyz @ //1, тогда также отображается недопустимое имя @ //2. Я не могу сравнить имя в структуре и имя, введенное пользователем.

Ответы [ 4 ]

1 голос
/ 21 июня 2020

fgets() также считывает символ новой строки ('\n') в конце буфера (когда это возможно). при нажатии Enter на консоли добавляется новая строка, что приведет к сбою сравнения. from man fgets:

Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. Завершающий нулевой байт ('\ 0') сохраняется после последнего символа в буфере.

, поэтому содержимое массива empName для ввода «Steve xyz», вероятно, будет:

['S', 't', 'e', 'v', 'e', ' ', 'x', 'y', 'z', '\n', '\0', ...garbage]

здесь переписывание кода, в основном вам нужно удалить '\n', если он есть. также была проблема при инициализации массива struct:

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

struct employee {
        int cardNo;
        char name[20];
        long salary;
        int age;
} emp[20] = {
        {0, "John Doe", 6500, 25},
        {1, "Steve xyz", 7000, 30},
        // initialize here other 18 structs if needed
};

int main(void)
{
        char empName[30];
        printf("Enter your name\n");

        char *ret = fgets(empName, 30, stdin);
        if (ret == NULL) {
                printf("Error while reading name\n");
                return 1;
        }

        // remove eventual trailing newline replacing it with '\0'
        empName[strcspn(empName, "\n")] = '\0';

        if (!(strcmp(empName,emp[1].name))) {      // 1
                // I don't know why you do this...
                strcpy(empName, "Steve xyz");
        } else {
                printf("Invalid name\n");          // 2
        }
}

edit : изменен подход к удалению новой строки с использованием strcspn() (благодаря @AndrewHenle в комментариях), который, кажется, идеально подходить для этой задачи. from man strcspn:

size_t strcspn (const char * s, const char * reject);

вычисляет длину начального сегмента s, который полностью состоит из байтов, не входящих в отклонить. возвращает количество байтов в начальном сегменте s, которых нет в строке reject.

0 голосов
/ 21 июня 2020
#include <stdio.h>
#include <string.h>

typedef struct employee
{
    int cardNo;
    char name[20];
    long salary;
    int age;
} Employee;


int main()
{
    char empName[30];
    Employee emp[20];

    emp[1].age = 30;
    emp[1].salary = 7000;
    emp[1].cardNo = 1;
    strcpy(emp[1].name, "Steve xyz");
    
    int len = strlen(emp[1].name);
    emp[1].name[len] = '\n';

    printf("Enter your name\n");
    fgets(empName, 30, stdin);


    if (!(strcmp(empName, emp[1].name))) //1
    {
        strcpy(empName, "Steve xyz");
    }
    else
    {
        printf("Invalid name\n"); //2
    }
}


0 голосов
/ 21 июня 2020

Фактически, fgets() также читает \n char, поэтому вам нужно сделать это после использования fgets()

   size_t len = strlen(empName);

    if (len > 0 && empName[len-1] == '\n') {
        empName[--len] = '\0';
    }

. Этим мы удаляем \n, а теперь сравнение определит, что они равны

0 голосов
/ 21 июня 2020

fgets считывает символы из входного потока, а также символ новой строки. Поэтому вам нужно удалить символ новой строки из empName, и это можно сделать следующим образом:

empName[strlen(empName) - 1] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...