Поиск палиндрома в тексте. Неправильный указатель - C (СИ)
Формулировка задачи:
* Найти и вывести на экран последний палиндром (слово-перевертыш) в тексте.
Забацано на Си
Умный компилятор ругается на "pal". Говорит: "Run-Time Check Failure #3 - The variable 'pal' is being used without being initialized."
Прошу, подскажите волшебному оленю где ошибка и как с ней бороться(
Заранее низкий поклон
#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 (); }
Решение задачи: «Поиск палиндрома в тексте. Неправильный указатель»
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; }
Объяснение кода листинга программы
- В функции
is_palindrome
происходит сравнение символов двух указателей:s
иt
. При этом,s
указывает на начало строки, аt
- на ее конец. Если символы на этих позициях совпадают, то они оба сдвигаются на одну позицию в сторону центра строки. Если при этомs
становится меньшеt
, то это значит, что строка является палиндромом. Функция возвращает значение1
, если строка является палиндромом, и0
в противном случае. - В функции
last_palindrome
происходит поиск последнего палиндрома в строке, разделенной определенным разделителем. Если строка не пустая, то функция вызывает саму себя, передавая в качестве аргумента следующий разделитель. Если следующий разделитель не найден, то функция проверяет, является ли текущая строка палиндромом. Если да, то она возвращает эту строку, иначе возвращаетNULL
. Если же текущая строка пустая, то функция также возвращаетNULL
. - В функции
main
происходит считывание строки с помощьюfgets
и вызов функцииlast_palindrome
для поиска последнего палиндрома в этой строке. Если палиндром найден, то он выводится на экран, иначе выводится сообщение об отсутствии палиндрома. После этого пользователю предлагается ввести новую строку. Цикл продолжается до тех пор, пока пользователь не введет пустую строку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д