программа паллиндром не работает, пожалуйста, проверьте приложенный код и вывод

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


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

void main()
{
 char str[100];
 int i,l,k;

 printf("type the desired to string to check pallindrome\n");
 gets(str);
 l=strlen(str);
 printf("%d\n", l);

 k=l-1;
 char temp[100];

 for(i=0;i<l;i++)
 {
   temp[k]=str[i];
   --k;

 }

 if(strcmp(temp, str)==0)
 {
   printf("pallindrome\n");
 }
 else
 {
   printf("not a pallindrome\n");
 }


}

вот результат

https://i.stack.imgur.com/XWcAp.png


person DevZer0    schedule 12.06.2021    source источник
comment
У вас нет завершающего нуля temp. В качестве альтернативы используйте strncmp   -  person Den-Jason    schedule 12.06.2021
comment
1. void main() должно быть int main() 2. gets -переполнение буфера. использовать fgets   -  person Ed Heal    schedule 12.06.2021
comment
В качестве примечания: Почему функция gets настолько опасна, что ее нельзя использовать?   -  person Andreas Wenzel    schedule 12.06.2021


Ответы (2)


Вам нужно добавить терминатор NUL в конце temp сразу после цикла for:

 for(i=0;i<l;i++)
 {
   temp[k]=str[i];
   --k;

 }
 temp[i] = '\0';

В противном случае функция strcmp вызовет UB.

person babon    schedule 12.06.2021
comment
что такое нулевой терминатор? а зачем strcmp без него вызывать уб? Я новичок в программировании, поэтому многого не знаю........ - person DevZer0; 12.06.2021
comment
@DevZer0 Терминатор NUL в C — это символ \0, добавленный после C-строки: en.wikipedia. org/wiki/Null-terminated_string . strcmp не будет знать, как далеко читать символы, если они отсутствуют, и может вступить в память, которой вы не владеете: stackoverflow.com/questions/24353504/whats-wrong-with-strcmp - person babon; 12.06.2021

Для начала по стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )

Массив temp не содержит строки, потому что вы забыли добавить к нему завершающий нулевой символ '\0'.

Итак, вызов strcmp

if(strcmp(temp, str)==0)

приводит к неопределенному поведению.

Также функция gets небезопасна и не поддерживается стандартом C. Вместо этого используйте функцию fgets.

Также для проверки того, является ли строка палиндромом, нет необходимости объявлять вспомогательный массив.

Код может выглядеть как

printf("type the desired to string to check pallindrome\n");
fgets(str, sizeof( str ), stdin );

str[strcspn( str, "\n" )] = '\0'; // to remove the new line character '\n'

size_t n = strlen( str );
printf( "%zu\n", n );

size_t i = 0;

while ( i < n / 2 && str[i] == str[n-i-1] ) ++i;

if( i == n / 2 )
{
    printf("pallindrome\n");
}
else
{
    printf("not a pallindrome\n");
}

Вы можете написать отдельную функцию, которая проверяет, является ли строка палиндромом.

Вот, пожалуйста.

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

int is_palindrome( const char *s )
{
    size_t n = strlen( s );
    
    size_t i = 0;
    
    while ( i < n / 2 && s[i] == s[n-i-1] ) ++i;
    
    return i == n / 2;
}

int main(void) 
{
    enum { N = 100 };
    char s[N];
    
    printf( "Type a desired string to check whether it is a palindrome: " );
    fgets( s, sizeof( s ), stdin );
    
    s[ strcspn( s, "\n" ) ] = '\0';
    
    if ( is_palindrome( s ) )
    {
        printf( "\"%s\" is a palindrome.\n", s );
    }
    else
    {
        printf( "\"%s\" is not a palindrome.\n", s );
    }
    
    return 0;
}

Вывод программы может выглядеть так

Type a desired string to check whether it is a palindrome: abcdedcba
"abcdedcba" is a palindrome
person Vlad from Moscow    schedule 12.06.2021
comment
Не должно быть if( i == n / 2 ) равным if( i >= n / 2 ) — учитывайте строки нечетной длины - person Ed Heal; 12.06.2021
comment
@EdHeal Нет, условие верное. - person Vlad from Moscow; 12.06.2021
comment
Ваш правильный. Виноват - person Ed Heal; 12.06.2021