strcmp не возвращает 0 для равных строк в c

Итак, я делаю программу, которая проверяет, является ли слово палиндромом, но когда дело доходит до сравнения конечных строк в конце, даже если они одинаковы, я получаю -1 результат редактирования: скопируйте и вставьте тот же код, который я использовал

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

int main()
{
    char input[50];
    char test[50];

    int ret;

    printf("Enter word or phrase to compare ");
    fgets(input,sizeof(input),stdin);
    strcpy(test,input);

    strrev(input);

    ret = strcmp(test,input);

    if(ret == 0)
        printf("\n this is a palindrome ");
    else
        printf("\n this is not a palindrome");
}

Для ввода я использовал «ала», который, как я знаю, является палиндромом, я получаю результат

this is not a palindrome

Демонстрация на IDEONE.


person Qball    schedule 06.02.2017    source источник
comment
test никогда не инициализируется.   -  person Paul Hankin    schedule 07.02.2017
comment
См. удаление новой строки из fgets .   -  person user3386109    schedule 07.02.2017
comment
Новая строка не имеет значения для этой конкретной цели, потому что она копируется в test вместе с остальной частью строки.   -  person John Bollinger    schedule 07.02.2017
comment
Программа в том виде, в котором она представлена, не имеет для меня описанной проблемы.   -  person John Bollinger    schedule 07.02.2017
comment
не могу воспроизвести. проголосовать за закрытие.   -  person Stargateur    schedule 07.02.2017
comment
Попробуйте поставить новую строку в конце подсказки printf("Enter word or phrase to compare ");   -  person Edward Karak    schedule 07.02.2017
comment
Не удается воспроизвести   -  person kaylum    schedule 07.02.2017
comment
какая у вас входная строка?   -  person yano    schedule 07.02.2017
comment
Вы не выложили код, где у вас якобы получается результат -1. Опубликуйте минимальный, полный и проверяемый пример, демонстрирующий проблему. Покажите несколько примеров ввода, ожидаемого вывода и фактического вывода.   -  person Weather Vane    schedule 07.02.2017
comment
Вы действительно могли бы сэкономить нам всем много времени, если бы показали настоящий код с самого начала. Отсутствие вызова strrev изменило весь вопрос.   -  person kaylum    schedule 07.02.2017
comment
@user3386109 user3386109 новая строка действительно была бы хорошей догадкой, если бы на самом деле код не работал. Но код, присутствующий в вопросе на момент моего комментария, работал нормально.   -  person John Bollinger    schedule 07.02.2017


Ответы (1)


Проблема в том, что вы вызываете strrev, не удаляя новую строку из вашего ввода, полученного от fgets. Это приводит к тому, что ваша перевернутая строка будет иметь newline в начале строки, что приведет к несоответствию, даже если вы намеревались указать палиндром в качестве входных данных.

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

if (fgets(input,sizeof(input),stdin) == NULL) {
    /* todo: ... handle error ... */
    return 0;
}
len = strlen(input);
if (input[len-1] == '\n') input[--len] = '\0';
strcpy(test,input);
person jxh    schedule 06.02.2017
comment
На самом деле этот вопрос задавали раньше. - person jxh; 08.02.2017