Palindrom: Problem beim entfernen von Sonderzeichen
-
loonie schrieb:
b) alle Zeichen außer Buchstaben aus dem Text entfernt,
dafür gibts: http://www.cplusplus.com/reference/clibrary/cctype/isalpha/
-
Das benutzt er doch sogar schon
-
Genmutant schrieb:
Das benutzt er doch sogar schon
ok, ich war wieder zu schnell, hab den code nicht beachtet.
-
loonie schrieb:
kannst du mir noch erklären warum ich zwei zähler brauche weil eigentlich haben die beide dann doch immer den gleichen Wert
Also guck, wir nehmen mal als Beispiel des input "ab12cd".
Am Anfang sind die beiden Zähler, counter und counter_buchstaben nennen wir sie mal, beide gleich groß, weil du ja beide hochzählst, wenn du schreibst.
dann schauen deine beiden arrays so aus bis zu dem Wert vom counter:
input: ab
workingCopy: ab
so, jetzt kommen deine Zahlen. Da zählt der normale counter hoch. Wenn du da jetzt einfach nur nicht schreiben würdest, hättest du sowas:
input: ab12
workingCopy: ab[müll][müll]
Das würde dazu führen dass du am Ende, wenn du das auf die gleiche Stelle kopierst, sowas hast:
workingCopy: ab[müll][müll]cdJetzt machst du das aber mit 2 Zählern. Der counter_buchstaben wird nur hochgezählt, wenn du auch wirklich was nach workingCopy schreibst.
D.h. die Zuordnung wird: workingCopy[counter_buchstaben]=input[counter];Drum hast du dann am Ende:
input(bis counter): ab12cd
workingCopy(bis counter_buchstaben): abcdVerstanden?
-
oder mach dir doch 'ne funktion zum rausfiltern von nicht-buchstaben. beispiel:
void letters_only (char *str) { char *p = str; while (*str) // string abklappern bis ende { if (isalpha(*str)) // buchstabe? { *p++ = *str; // ja, dann übernehmen } str++; // naechstes zeichen } *p = 0; // mit 0 abschliessen } void main() { char test[] = "1234ha77.llo88 du da){"; letters_only (test); puts (test); }
-
Schöne Sache, sogar ohne zusätzliches Array
-
Genmutant schrieb:
Schöne Sache, sogar ohne zusätzliches Array
danke, bin nun mal ein grosser freund von sparmassnahmen. naja, aber sollte ein zweites array nötig sein, lässt sich die funktion auch ganz leicht umbauen.
-
;fricky schrieb:
char *p = str; while (*str) // string abklappern bis ende { if (isalpha(*str)) // buchstabe? { *p++ = *str; // ja, dann übernehmen } str++; // naechstes zeichen } *p = 0; // mit 0 abschliessen
-
jetzt hab ich kapiert warum zwei zaehler, besten dank dür die Erklärung Genmutant!
hatte jetzt noch keine Zeit es umzuschreiben.und danke für die "Teilmusterlösung" aber werde mein Programm umschreiben... da steckt dann doch der ergeiz hinter, es zum lauifen zum bringen.
mfg
-
so hab das Programm jetzt fertig:
#include<stdio.h> #include<string.h> #include<ctype.h> int main(void){ int inputLenght = 0, counter = 0, counterWrite = 0 ; char input[255], workingCopy[255], outputPalindrom[255], output[255]; printf("Palindrom\n"); printf("Geben Sie einen Text ein: "); fgets(input, sizeof(input) , stdin); inputLenght = strlen(input); for(counter=0;counter<inputLenght;counter++) { if (isalpha (input[counter])) { workingCopy[counterWrite]=input[counter]; counterWrite++; } } workingCopy[counterWrite] = '\0'; inputLenght = strlen(workingCopy); for(counter = 0; counter<inputLenght; counter++){ if(islower(workingCopy[counter])){ workingCopy[counter] = toupper(workingCopy[counter]); } output[counter] = workingCopy[counter]; } output[counterWrite] = '\0'; workingCopy[counterWrite] = '\0'; for(counter = 0; counter<inputLenght; counter++){ outputPalindrom[counter] = workingCopy[inputLenght-counter-1]; } outputPalindrom[counter] = '\0'; printf("\n"); printf("Ihre Eingabe nachdem entfernen aller Zeichen ausser Buchstaben ist:\n"); printf("%s\n", output); printf("\n"); printf("Die neue laenge Ihrer Eingabe ist:\n"); printf("%d\n", inputLenght); printf("\n"); printf("Die Ausgabe in umgedrehter Reinfolge ist:\n"); printf("%s\n", outputPalindrom); printf("\n"); if(strncmp(output, outputPalindrom, inputLenght)==0) { printf("Bei der Eingabe handelt es sich um ein Palindrom!\n"); } else { printf("Bei der Eingabe handelt es sich um kein Palindrom!\n"); } printf("\n"); return 0; }
und ein Dankeschön für die Hilfe
hab doch noch eine Frage und zwar bekomme ich wenn ich mit der Option -O2 (gcc -O2 Palindrom.c) compiliere bekomme ich diesen Fehler:
"Palindrom.c:25: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result"