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.