2010-11-21 14 views
0

J'ai essayé d'écrire une fonction en C qui détecte les palindromes. Le programme ressemble actuellement les éléments suivants:Diviser une chaîne en C en parties séparées

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

int main() 
{ 
    char palindrome[24]; int palength; int halflength; 
    gets(palindrome); 
    palength = strlen(palindrome); 
    halflength = palength/2; 
    printf("That string is %u characters long.\r\n", palength); 
    printf("Half of that is %u.\r\n", halflength); 
    return 0; 
} 

En ce moment, il détecte la longueur d'une chaîne, et montre aussi ce que la moitié de ce qui est. C'est juste pour m'assurer que cela fonctionne comme je le pense. Ce que le reste de la fonction devrait faire (si possible) est de prendre l'entier de "halflength" et l'utiliser pour enlever cette quantité de caractères du début et de la fin de la chaîne et les stocker dans des chaînes séparées. De là, je serais capable de comparer les personnages dans ceux-ci, et de pouvoir retourner vrai ou faux si la chaîne est en effet un palindrome. TL; DR - Est-il possible de prendre une certaine quantité de caractères (dans ce cas, l'entier "halflength") à l'avant et à la fin d'une chaîne et de les stocker dans des variables séparées. Lisez ci-dessus pour plus d'informations sur ce que j'essaie de faire.

P.S. - Je sais ne pas utiliser gets(), mais je n'ai pas envie d'écrire une fonction pour tronquer \ n de fgets().

+3

Vous n'avez pas besoin d'une copie séparée de la chaîne pour détecter les palindromes. Astuce: vous itérez sur les caractères d'une chaîne à l'aide d'un pointeur et vous pouvez itérer à la fois vers l'avant et vers l'arrière. –

+0

Pourquoi ne pas le faire de la manière classique, c'est-à-dire faire une itération du début à la fin de la chaîne, en comparant avec le caractère correspondant à la fin? –

+0

Merci pour cela, n'a pas pensé à cette façon de faire les choses. Je voulais juste le faire pour le plaisir, et ce que j'avais commencé ci-dessus était ma première pensée. – austinprete

Répondre

4
int len = strlen(palindrome) - 1; // assuming no \n 
int half = len << 1; 
for (int i=0; i<=half; ++i) 
    if(palindrome[i] != palindrome[len-i]) 
    return false; 
return true; 
0

J'ai découvert que j'appréhendais le problème. Comment je devrais faire ceci est l'itération sur les caractères en utilisant un pointeur à la fois en avant et en arrière. Bien que si vous souhaitez toujours répondre à la question d'origine, il pourrait être utile à un moment donné.

1

si vous faites quelque chose comme ça,

char *str1="lol",*str2; 
str2=strrev(str1); 

// si les deux sont identiques, alors il est en fait un palindrome;

+0

-1 str1 et str2 doit être char * pas char, strrev n'est pas C standard – user411313

+0

pourquoi ne pas faire un de ses propres strrev()? Je n'ai jamais dit utiliser string.h;) –

+0

Merci pour la suggestion. Je ne sais pas exactement quelles sont les chances de moi de faire la mienne, haha. Pas vraiment un expert en C, plutôt nouveau, comme dans une semaine de programmation en C. – austinprete