2015-07-14 7 views
-1

У меня есть вопрос об этом коде, который я пишу для упражнения. Я должен проверить, является ли строка палиндром. Я не могу изменить объявление функции. Функция возвращает только 1, когда все буквы одинаковы (например, «aaaa»), но если я заряжу предложение другим палиндром (например, «anna»), функция возвращает мне 0, я не могу понять, почему это приложение. Спасибо!Проверьте, является ли строка палиндром в C

char* cargar (char*); 
int pali (char*); 

int main() 
{ 
    char*texto=NULL; 
    texto=cargar(texto); 
    int res=pali(texto); 
    if(res==1){printf("\nPalindrome");} 
    else printf("\nNot palindrome"); 

    return 0; 
} 

char* cargar (char*texto) 
{ 
    char letra; 
    int i=0; 
    texto=malloc(sizeof(char)); 
    letra=getche(); 
    *(texto+i)=letra; 
    while(letra!='\r'){ 
     i++; 
     texto=realloc(texto,(i+1)*sizeof(char)); 
     letra=getche(); 
     *(texto+i)=letra;} 
    *(texto+i)='\0';  
    return texto; 
} 

int pali (char* texto) 
{ 
    int i; 
    for(i=0;*(texto+i)!='\0';i++){ 
    }i--; 
    if(i==0||i==1){return 1;} 

    if(*texto==*(texto+i)){ 
     return pali(++texto); 
    } 
    else return 0; 
} 
+1

Каков ваш вопрос? –

+0

Если я поставил что-то вроде anna, функция вернет мне 0, но «anna» - это палиндром – Marco

+0

Есть много ресурсов, которые показывают алгоритмы для этой проблемы. Вот один для c - http://www.programmingsimplified.com/c-program-find-palindrome – MrMadsen

ответ

5

Ваша функция определения того, является ли строка палиндром, хорошо продумана.

Предположим, у вас есть строка s длины l. Символы в строке выкладываются как:

Indices: 0 1 2 3   l-4 l-3 l-2 l-1 
     +----+----+----+----+- ... -+----+----+----+----+ 
     | | | | | ... | | | | | 
     +----+----+----+----+- ... -+----+----+----+----+ 

Если строка является палиндромом,

s[0] = s[l-1] 
s[1] = s[l-2] 

... 

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

Чтобы перевести это в код,

int is_palindrome(char const* s) 
{ 
    size_t len = strlen(s); 
    if (len == 0) // An empty string a palindrome 
    { 
     return 1; 
    } 

    size_t i = 0; 
    size_t j = len-1; 
    for (; i < j; ++i, --j) 
    { 
     if (s[i] != s[j]) 
     { 
     // the string is not a palindrome. 
     return 0; 
     } 
    } 

    // If we don't return from inside the for loop, 
    // the string is a palindrome. 
    return 1; 
} 
+0

size_t j = len-1; – this

+0

@this, я не получил твой дрейф. –

0

MARCO попробовать это.

#include <stdio.h> 
#include <stdlib.h> 
#include<string.h> 
char* cargar (char*); 
int pali (char*); 

int main() 
{ 

char*texto=NULL; 

texto=cargar(texto); 

int res=pali(texto); 

if(res==strlen(texto)){printf("\nPalindrome");} 
else printf("\nNot palindrome"); 

    return 0; 
} 


char* cargar (char*texto) 
{ 
char letra; 
int i=0; 
texto=malloc(sizeof(char)); 
letra=getche(); 
*(texto+i)=letra; 
while(letra!='\r') 
{ 
    i++; 
    texto=realloc(texto,(i+1)*sizeof(char)); 
    letra=getche(); 
    *(texto+i)=letra; 
} 
*(texto+i)='\0';  
return texto; 
} 

int pali (char* a) 
{ 
int flag=0,i; 
int len=strlen(a); 
for (i=0;i<len;i++) 
    { 
    if(a[i]==a[len-i-1]) 
     flag=flag+1; 
    } 
    return flag; 
} 
0

Вы pali функциональные тесты, если первый символ строки равен последнего символа, а затем вызывает себя на позицию второго символа строки. Обратите внимание, однако, что он не изменяет конец строки, поэтому рекурсивный вызов сравнивает второй символ с последним. Затем вы сравниваете третий символ с последним ... Finaly pali возвращает 1, если все символы равны последнему, то есть если все равны.

Попробуйте это:

int pali (char* texto) 
{ 
    char* end; 
    for(end = texto; *end != '\0'; end ++) 
     ; 

    for(--end; texto < end; ++texto, --end) { 
     if(* texto != * end) 
      return 0; 
    } 
    return 1; 
} 
Смежные вопросы