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.
Warum subtrahieren Sie 1 vom Rückgabewert von strlen? – bruceg
Sie müssen den String, den Sie in 'palindrom []' erstellen, auf null setzen. –
@bruceg Ich vermute, dass es den abschließenden Newline-Charakter entfernt. –