Почему кажется, что строки не равны? - PullRequest
0 голосов
/ 19 декабря 2018
int main()
{        
    int n = 100;    
    char a[n];    
    char b[ ]="house";

    fgets(a,n-1,stdin); // type "house"

    if (strcmp(a,b) == 0)
        printf("The strings are equal.\n");
    else
        printf("The strings are not equal.\n");

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Причина, по которой это

if (strcmp(a,b) == 0) { }

неверно, поскольку fgets() хранит \n в конце буфера.Итак, здесь массив a выглядит как house, а массив b выглядит как house\n (если клавиша ENTER была нажата после ввода символов ввода) и strcmp(a,b) не возвращает 0.Со страницы справочника fgets()

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

В одну сторонудолжен использовать strcspn(), который удаляет завершающий \n.Например,

fgets(a,n,stdin);
a[strcspn(a, "\n")] = 0;

Теперь сравните массив символов как

if (strcmp(a,b) == 0) {
        printf("The strings are equal.\n");
}
else {
        printf("The strings are not equal.\n");
}
0 голосов
/ 19 декабря 2018

В вашем примере это то, что сравнивает strcmp

strcmp("house\n", "house")

Что неверно.

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

int main()
{
    int n = 100;
    char a[n];
    char b[] = "house";
    fgets(a, n-1, stdin);
    a[strlen(a) - 1] ='\0';  //you may want to add length checking to prevent errors if user input is null
    if (strcmp(a, b) == 0)
        printf("The strings are eq\n");
    else
        printf("Not eq\n");
    return 0;
}
...