Поиск палиндрома в тексте. Неправильный указатель - C (СИ)

Узнай цену своей работы

Формулировка задачи:

* Найти и вывести на экран последний палиндром (слово-перевертыш) в тексте. Забацано на Си
#include "stdafx.h"
#include "string.h"
#include "conio.h"
#define N 100
int main ()
{
	char S1[N];
    char*lek;
    char*lek1;
    char*pal;
    printf ("Vvedite tekst\n");
    gets (S1);
    printf ("Ishodnaya stroka:");
    puts (S1);
	pal=strcpy(pal,"");
    if (strlen(S1)==0)
	   printf ("Pystaya stroka, bro\n");
    else
    {
		lek=strtok(S1,",./ !?");
        while (lek!=NULL)
        {   lek1=strrev(strdup(lek));
		    puts (lek1);
			
             if (strcmp(lek,lek1)==0)
			 pal=strcpy(pal,lek);
             lek=strtok(NULL,",./ !?");
        }
        if (strlen(pal)==0)
           printf ("Net palindromov\n");
        else
        {
		   printf ("Palindrom:\n");
           puts (pal);
        }
    }
    getch ();
}
Умный компилятор ругается на "pal". Говорит: "Run-Time Check Failure #3 - The variable 'pal' is being used without being initialized." Прошу, подскажите волшебному оленю где ошибка и как с ней бороться( Заранее низкий поклон

Решение задачи: «Поиск палиндрома в тексте. Неправильный указатель»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
 
int is_palindrome(const char * s) {
    const char * t = s + strlen(s) - 1;
    
    while ( s < t && *s == *t ) {
        ++s;
        --t;
    }
    
    return ( s >= t );
}
 
char * last_palindrome(char * str, const char * delim) {
    if ( str = strtok(str, delim) ) {
        char * next = last_palindrome(NULL, delim);
        if ( next )
            return next;
        else if ( is_palindrome(str) )
            return str;
        else
            return NULL;
    }
    else
        return NULL;
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        char * lp = last_palindrome(buf, DELIM);
        if ( lp )
            printf("Last palindrome: %s\n", lp);
        else
            printf("Can't find any palindrome.\n");
    }
    
    return 0;
}

Объяснение кода листинга программы

  1. В функции is_palindrome происходит сравнение символов двух указателей: s и t. При этом, s указывает на начало строки, а t - на ее конец. Если символы на этих позициях совпадают, то они оба сдвигаются на одну позицию в сторону центра строки. Если при этом s становится меньше t, то это значит, что строка является палиндромом. Функция возвращает значение 1, если строка является палиндромом, и 0 в противном случае.
  2. В функции last_palindrome происходит поиск последнего палиндрома в строке, разделенной определенным разделителем. Если строка не пустая, то функция вызывает саму себя, передавая в качестве аргумента следующий разделитель. Если следующий разделитель не найден, то функция проверяет, является ли текущая строка палиндромом. Если да, то она возвращает эту строку, иначе возвращает NULL. Если же текущая строка пустая, то функция также возвращает NULL.
  3. В функции main происходит считывание строки с помощью fgets и вызов функции last_palindrome для поиска последнего палиндрома в этой строке. Если палиндром найден, то он выводится на экран, иначе выводится сообщение об отсутствии палиндрома. После этого пользователю предлагается ввести новую строку. Цикл продолжается до тех пор, пока пользователь не введет пустую строку.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5