2017-10-19 1 views
0

Also ich versuche, einen Code zu machen, der überprüft, ob ein Wort ein Palindrom ist. Also habe ich das vom Benutzer eingegebene Wort umgekehrt und überprüft, ob die Wörter gleich sind. Es gibt jedoch immer "Nicht gleich" zurück. Kann jemand so freundlich sein zu erklären, warum das nicht funktioniert?Warum funktioniert mein Code nicht, um zu überprüfen, ob ein Wort ein Palindrom ist?

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

#define STRING_LENGTH 200 


int main() { 
    char s[STRING_LENGTH] = {0}; 

    fgets(s, STRING_LENGTH, stdin); 
    int Ordlengde = strlen(s) - 1; 


    printf("The word contains %i letters", Ordlengde); 

    int i; 
    char palindrom[STRING_LENGTH]; 
    int x = 0; 


    for (i = Ordlengde; i >= 0; --i) 
    { 
     palindrom[x++] = s[i]; 
    } 

    int Ordlengde1 = strlen(palindrom) - 1; 
    printf("The word contains %i letters", Ordlengde); 


    printf("\nThe word reversed is %s", palindrom); 
    printf("%s",s); 
    if (strcmp(s , palindrom) == 0) 
     printf("are equal\n"); 
    else 
     printf("are not equal \n"); 

    return 0; 
} 
+1

Warum subtrahieren Sie 1 vom Rückgabewert von strlen? – bruceg

+0

Sie müssen den String, den Sie in 'palindrom []' erstellen, auf null setzen. –

+1

@bruceg Ich vermute, dass es den abschließenden Newline-Charakter entfernt. –

Antwort

1

Das eigentliche Problem bestand darin, die abschließende Zeilenumbruch nicht zu entfernen. Es hilft manchmal, Ihre Ausgabe für die einfache Erkennung von nicht-druckenden Zeichen-Problemen wie tabs, newlines usw. zu zitieren. Dies macht das Problem sofort sichtbar. (Anmerkung: wo die Zitate mit Ihrem ursprünglichen Logik am Ende)

$ ./bin/palindrome 
foo 
The word contains 3 lettersThe word contains 3 letters 
The word reversed is ' 
oof' <-> 'foo 
' (original) are not equal 

(Sie vergleichen \noof mit foo\n die versagte)

Korrektur der Newline Entfernung und Dinge ein wenig aufzuräumen, Ihre Logik für die Umkehrung und Überprüfung funktioniert gut, z

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

#define STRING_LENGTH 200 

int main() { 

    int x = 0, Ordlengde; 
    char s[STRING_LENGTH] = "", 
     palindrom[STRING_LENGTH] = ""; 

    printf ("enter a word: "); 
    if (!fgets (s, STRING_LENGTH, stdin)) { /* VALIDATE INPUT */ 
     fprintf (stderr, "error: invalid input - EOF.\n"); 
     return 1; 
    } 

    Ordlengde = strlen(s) - 1; 
    if (s[Ordlengde] == '\n')    /* check/remove '\n' */ 
     s[Ordlengde] = 0; 

    while (Ordlengde--)      /* reverse s */ 
     palindrom[x++] = s[Ordlengde]; 

    printf ("\noriginal: '%s'\nreversed: '%s' - ", s, palindrom); 

    if (strcmp(s , palindrom) == 0)   /* compare */ 
     printf("is a palindrom\n"); 
    else 
     printf("is not a palindrom\n"); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/palindrome 
enter a word: foo 

original: 'foo' 
reversed: 'oof' - is not a palindrom 

$ ./bin/palindrome 
enter a word: foof 

original: 'foof' 
reversed: 'foof' - is a palindrom 

Ein paar letzten Noten. Erstens, wenn Sie Benutzereingaben erwarten, dann fragen Sie danach. Andernfalls lässt du den Benutzer einen blinkenden Cursor auf der Konsole sehen - frage dich, ob das Programm hängt. Sicher, Sie wissen, dass Sie ein Wort eingeben müssen, aber etwas über jemanden, der Ihren Code zum ersten Mal ausführt. Nichts Besonderes ist erforderlich, nur einfach prompt:

printf ("enter a word: "); 

Als nächstes würde ich empfehlen, die „traditionelle“ überprüft mit der vollen Länge der Zeichenfolge minus 1. Warum? Was wäre, wenn die Zeichenfolge 201 Zeichen lang wäre? Es würde am Ende keine neue Linie sein ... Deshalb unter die traditionelle Kontrolle der ursprünglichen Länge erhalten, bis Sie bestätigen eine newline ist zu trimmen:

Ordlengde = strlen(s); 
if (Ordlengde && s[Ordlengde - 1] == '\n') /* remove '\n' */ 
    s[--Ordlengde] = 0; 

am Ball bleiben und viel Erfolg bei der Codierung.

+0

ich sehe. Danke für die gründliche Erklärung. Ich schätze es! – kenn1ld

+0

Sicher, froh zu helfen. Ich habe ein paar Notizen am Ende der Antwort für Sie hinzugefügt. –

+0

bei 'if (Ordlengde && s [Ordlengde] == '\ n')': 'Ordlengde &&' scheint eine fast bedeutungslose Wache zu sein. – BLUEPIXY

Verwandte Themen