2016-02-13 1 views
-3

Je suis toujours un codeur débutant, et j'ai de la difficulté à écrire un programme pour vérifier si une chaîne est un palindrome ou non en utilisant seulement les bibliothèques <stdio.h> et <stdlib.h>.C programme pour palindrome

La chaîne peut contenir au plus 30 caractères. Nous devons supposer que la chaîne peut prendre des chiffres, des caractères de ponctuation et des lettres. En outre, supposons qu'il n'y a pas d'espaces dans la chaîne. Doit différencier les caractères majuscules et minuscules. Donc "madame" serait un palindrome, mais "MaDam" ne serait pas un palindrome. La chaîne se termine par un terminateur null. Salut, donc quand je compile avec gcc -Wall. J'ai ces erreurs. Quelqu'un peut-il s'il vous plaît expliquer comment je peux réparer ces erreurs? Merci pour votre temps.

s_palindrome.c:24:15: warning: variable 'length' is used uninitialized whenever 
    'for' loop exits because its condition is false 
    [-Wsometimes-uninitialized] 
for (a=0; **a<30**; a++){ 

is_palindrome.c:36:18: note: uninitialized use occurs here 
for (a=0; **a<(length/2)**; a++){ 

is_palindrome.c:24:15: note: remove the condition if it is always true 
for (a=0; **a<30**; a++){ 

is_palindrome.c:12:18: note: initialize the variable 'length' to silence this 
    warning 
**int a, length;**= 0 

code

#include <stdio.h> 
#include <stdlib.h> 
int main(){ 
char string [30]; 
int a, l; 
int p=1; 

printf("Enter a string to test: \n"); 
scanf("%s", string); 

for (a=0; a<30; a++){ 
    if (string[a]=='\0'){ 
     l=a; 
     break; 
    } 
} 

for (a=0; a<l/2; a++){ 
    if (string[a]!=string[l-1-a]){ 
     p=0; 
    } 
} 

if (p){ 
    printf("%s is a palindrome\n", string); 
} 
else { 
    printf("%s is not a palindrome\n", string); 
} 

return 0; 
} 
+3

Vous avez montré du code mais vous ne l'avez pas mentionné. Est-ce que ça marche? Si non, quel est son comportement? Autrement dit, pourquoi posez-vous une question très générale plutôt que de la relier au code que vous avez écrit? – kaylum

+1

Il y a plusieurs erreurs, à la fois syntaxiques et logiques, dans le code que vous avez posté. –

+0

Je vote à contrecoeur pour rouvrir, car la raison de fermeture ne s'applique plus. Notez que la réponse à votre question est dans l'avertissement lui-même: 'note: initialisez la variable 'length' pour faire taire cet avertissement' –

Répondre

-3

Voici le code

#include <stdio.h> 
#include <stdlib.h> 
int main(){ 
char str[30]; 
int i, len=0; 
int flag=1; 
printf("Enter a string: \n"); 
scanf("%s", &str); 

for (i=0; str[i]!='\0'; i++){ 
len++; 
} 
len--; 

for(i=0;i<=len/2;i++) 
    if(str[i]!=str[len-i]) 
    { 
     flag=0; 
     break; 
    } 

if(flag==1) 
    printf("%s is a palindrome. \n", str); 
return 0; 
} 
+0

salut pouvez-vous expliquer ce que drapeau signifie s'il vous plaît? – user44775

+3

Vous n'êtes pas censé donner le code. Vous devez fournir une explication des problèmes que l'OP a dans son code, puis fournir des exemples de code annoté.Votre réponse n'a aucune de ces choses – Levi

+0

@ user44775 'flag' ici est simplement utilisé comme un indicateur, qui enregistre si la boucle n'a pas complété ses itérations et a dû' break 'entre ou non, ce qui signifie que sa valeur initiale '1 'indiquerait que l'entrée était un palindrome (boucle exécutée complètement) et au contraire une valeur de' 0' indiquerait que l'entrée n'était pas un palindrome (boucle cassée), ce qui est la vérification que @Abhay a manquée. –

0

Il y a un certain nombre de problèmes, dont la plupart empêchent votre programme de compilation.

  • Vous définissez string mais utilisez str à chaque emplacement. Changez donc la définition en str.
  • printf("%s is not a palindrome!"\n);: La nouvelle ligne est en dehors de la chaîne et vous n'avez pas passé str en tant que paramètre pour l'imprimer.
  • printf("%s is a palindrome. \n");: Encore une fois, str n'est pas passé pour imprimer
  • for (first=0, first=e; str[first]!='\0',first>=0, first++, last--){
    • Il y a deux parties au lieu du 3 nécessaire, à savoir un manque ;. Il devrait aller avant first++.
    • Vous ne pouvez pas virguer des parties séparées du conditionnel. Vous devez utiliser un connecteur logique tel que || ou &&. Dans ce cas, cependant, seule la première partie est nécessaire, vous pouvez donc supprimer la deuxième partie.
    • Vous n'initialisez pas last. first=e doit être last=e;
    • Résultat de fixation ci-dessus: for (first=0, last=e; str[first]!='\0'; first++, last--){
  • manquant } juste avant la return à la fin.
  • Pas une erreur, mais if(str[first]==temp[first]) continue; peut être supprimé, puisque vous êtes au fond de la boucle de toute façon.
0
int valid=1;//is palindrome 
for(i=0, j=e; i<j; ++i, --j) { 
    if(str[i] != str[j]){ 
     valid=0; 
     break; 
    } 
} 

cette aide?il semble que vous Overthinking ce problème

2

Voici la version corrigée de votre code, que j'ai testé pour fonctionner:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char str[30], temp[30]; 
    int first, last, e; 
    printf("Enter a string: "); 
    scanf("%s", str); 

    for (first=0; str[first]!='\0'; first++) 
    { 
    e = first; 
    } 
    // loop finds the length of the string, e=first is the index of the last character of the string 

    // code to store reverse of str in temp 
    for (first = 0, last = e; str[first] != '\0'; first++, last--) 
    { 
    temp[first] = str[last]; 
    } 
    temp[first] = '\0'; 

    // code to compare str and reverse of str i.e. temp 
    for (first=0; str[first]!='\0'; first++) 
    { 
     // if any character in str and reverse str i.e. temp is unequal, break the loop 
     if(str[first]!=temp[first]) 
     { 
     printf("%s is not a palindrome!\n",str); 
     break; 
     } 
    } 

    // if loop did not break str and reverse str i.e. temp are equal 
    if(str[first]=='\0') 
    { 
    printf("%s is a palindrome.\n",str); 
    } 
    return 0; 
} 

Il y avait plusieurs problèmes tels que:

  • char string[30]; déclaré mais str utilisé à la place.

  • e=first ne sera pas égale à la longueur de la chaîne, ce dernier sera plutôt un de moins que lui, ce qui en fait l'indice du dernier caractère de la chaîne.

  • Cette e a été utilisée à tort dans for (first=0, first=e; str[first]!='\0',first>=0, first++, last--), où first est initialisée deux fois, ce qui lui fait perdre sa valeur initiale. Au lieu de cela, last aurait dû être initialisé à e. En outre, la boucle for peut avoir plusieurs initialisations ainsi que des incréments/décréments (séparés par des virgules), mais pas plusieurs conditions. Et le séparateur entre les initialisations, la condition et les incréments/décréments devrait être un point-virgule ;, qui manquait dans votre cas.

  • Il n'y avait pas besoin pour les déclarations continue; à la fin de la boucle, car contrairement continuebreak, est utilisé pour arrêter l'itération en cours d'exécution ultérieure et passer à la prochaine itération. Puisque, ici vous n'avez plus de code à exécuter dans l'itération courante, le continue est superflu et n'est pas nécessaire. La fonction printf a été utilisée incorrectement. Dans cette fonction, vous devez fournir un spécificateur de format en tant que première entrée, qui correspond au format de rendu de la sortie. Tous les caractères de nouvelle ligne \ n, les espaces et les espaces réservés pour toutes les variables à inclure dans la sortie finale doivent être spécifiés ici. Le reste des arguments à printf, contiendrait toutes les variables, pour lesquelles, les espaces réservés ont été définis dans le format chaîne de spécification passée en premier argument.

  • Une accolade } était manquante pour la dernière if.

  • J'ai corrigé le même algorithme de base que vous avez posté, mais ce n'est pas très efficace. Un algorithme plus efficace éviterait de créer un autre tableau inverse. Au lieu de cela, il commencerait à comparer les caractères du premier et du dernier index dans la même chaîne, en incrémentant d'abord et en décrémentant le dernier à chaque étape, jusqu'à ce que le caractère du milieu soit atteint.