Strings Buchstaben vertauschen
-
@wob achso ja gut dann hat sich das erledigt.
-
So, ich habe etwas rum probiert, doch ich komme jetzt nicht mehr weiter...
Ich habe die Funktion strstr eingebaut, allerdings weiß ich nun nicht, wie ich das 'en' ersetze mit 'x'. Mit der Replace-Methode würde ich ja viel zu lang werden an Zeilen.
Wie kann ich nun das gefundene 'en' vonstrstr
umwandeln?
-
@codinglea sagte in Strings Buchstaben vertauschen:
Mit der Replace-Methode würde ich ja viel zu lang werden an Zeilen.
Manchmal muss man auch Code schreiben.
Wie kann ich nun das gefundene 'en' von strstr umwandeln?
An die Stelle vom e (da zeigt der Rückgabewert von strstr hin) ein 'x' schreiben und den Rest vom String um eine Stelle nach links verschieben.
(Das geht mit einer Schleife oder mit der Funktionmemmove
)
-
@DirkB
Na ja, meine Aufgabe besteht darin, den Code ziemlich kurz zu halten bei solchen "kleinen" Aufgaben...
Okay, vielen Dank! Ich probiere es direkt aus.
-
Und aufpassen, denn es kann ja auch umgekehrt sein, dass die neue Zeichenkette länger ist als die alte Zeichenkette.
So ganz allgemein ist das schon halbwegs fortgeschrittener Stoff. Nicht ohne Grund, gibt es in der Standardbibliothek keine allgemeine Stringersetzungsfunktion. Denn beim Ersetzen von Teilzeichenketten durch Ketten anderer Länge muss man ungeheuer aufpassen und eine Menge Annahmen machen, die nicht unbedingt offensichtlich sind. Doch du scheinst (nichts für ungut), doch relativ planlos zu sein, was C-Strings angeht. Bist du sicher, dass du die Aufgabe richtig verstanden hast? Die ist nämlich viel zu schwer für den Kenntnisstand, der bei dir durchblickt (sie ist sogar so schwer, dass ich hier nicht einmal eine allgemeine Lösung demonstrieren möchte, weil es mir zu anstrengend wäre). Falls du dir die Aufgabe selbst gestellt hast: Such dir etwas einfacheres! Eine gute Standardaufgabe um mit Zeichenketten fit zu werden, ist das Nachprogrammieren der Funktionen aus
string.h
. Und wenn du die alle locker aus dem Handgelenk schütteln kannst, dann bist du bereit für eine allgemeine Ersetzungsfunktion.
-
Buchstabenmanipulationen (Zeichenketten)
Schreiben Sie die folgenden kleinen Programme. Alle erwarten einen String, bestehend aus einigen Sätzen. Schreiben Sie zunächst also ein Hauptprogramm, das einen längeren Text mit Leerschlägen und Sonderzeichen als String oder char[]-array enthält oder vom Anwender erfragt (scan).
• auspressen(): Schreiben Sie eine Methode, die aus dem Text alle Buchstaben 'e' entfernt. Dabei werden die 'e' nicht etwa durch einen Leerschlag ersetzt, sondern die Zeichenkette wird bei jedem 'e' um ein Zeichen kürzer.
• nurBuchstaben(): Schreiben Sie eine Methode, die alle Zeichen, die weder Buchstaben, Ziffern noch Leerschläge sind, eliminiert. Der ausgegebene Text (Rückgabewert) enthält also insbesondere keine Sonderzeichen mehr. Aus "Hallo-oh! Welt!" wird "Hallooh Welt".
• miniKompression(): Schreiben Sie eine Methode, die im Text alle Vorkommen der Zeichenkette "en" durch 'x' ersetzt und umgekehrt ('en' → 'x' und 'x' → 'en'). Daneben sollen auch alle Vorkommen von "er" mit 'q' vertauscht werden. Zu guter Letzt soll noch jedes 'y' durch ein "ch" ersetzt werden, dafür bei jedem "ch" nur noch ein 'y' stehen. Haben Sie bemerkt worauf es hinausläuft? Wir haben soeben selbst eine kleine Kompressionsroutine geschrieben. Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.Das ist meine Aufgabe... die ersten beiden Punkte habe ich ziemlich schnell abgearbeitet, doch bei dem 3. Punkt bleibe ich stecken...
Kann sein, dass ich sie falsch verstehe...
-
@codinglea Wenn du einen neuen String erzeugst (also nicht das Original änderst), kommst du mit einem Lese- und einem Schreibindex aus.
Das Verschieben passiert da automatisch.
@codinglea sagte in Strings Buchstaben vertauschen:
String oder char[]-array
Hat dein Lehrer/Tutor/... gesagt, wo er da bei C den Unterschied sieht?
-
Das ist von www.programmieraufgaben.ch, oder? (Das erklärt die ungewöhliche Wortwahl...)
Das sind sprachunabhängige Aufgaben. Da gibt es jetzt leider ein Problem: In so ziemlich jeder anderen Sprache ist die Aufgabe ein trivialer Dreizeiler, weil es in den meisten Sprachen einen eingebauten Stringdatentyp gibt, der einem das ganze komplizierte Zeug unter der Haube abnimmt. Da ist dann Suchen, Löschen, und Einfügen ganz einfach. Aber halt nicht in C, wo man das alles selber schreiben muss. Hier ist das eine Hammeraufgabe für sehr Fortgeschrittene.
-
@DirkB sagte in Strings Buchstaben vertauschen:
@codinglea Wenn du einen neuen String erzeugst (also nicht das Original änderst), kommst du mit einem Lese- und einem Schreibindex aus.
Das Verschieben passiert da automatisch.
Das hast du aber ein Problem mit der letztendlichen Länge, die sich nicht vorhersehen lässt, ohne dass man vorher wenigstens einmal alles durchgegegangen ist. Oder man muss während des Ersetzungsvorgang dynamisch neu allokieren bei Bedarf. Ersteres ist nicht so schön, letzteres ist nicht so einfach. Und die dritte Methode, im Vorhinein zu schätzen (oder den Worst case zu berechnen) ist auch nicht toll. Zumal es ja auch gar nicht so billig ist, die Länge eines Strings im Vorhinein zu bestimmen. Alles reichlich unschön, außer halt der komplizierten Volldynamikmethode.
-
@SeppJ sagte in Strings Buchstaben vertauschen:
Und die dritte Methode, im Vorhinein zu schätzen (oder den Worst case zu berechnen) ist auch nicht toll.
Das ist doch aber (leider) das Standardverfahren C.
Beistrcat
arbeitet man doch auch nicht anders.
-
@SeppJ sagte in Strings Buchstaben vertauschen:
Das ist von www.programmieraufgaben.ch, oder? (Das erklärt die ungewöhliche Wortwahl...)
Das kann gut sein, ein paar Aufgaben hatte ich schon von dort bekommen.
Hier ist das eine Hammeraufgabe für sehr Fortgeschrittene.
Na toll die Aufgabe kann ich leider nicht auslassen...
Daher freue ich mich über jede Unterstützung! Die Herausforderung liegt natürlich auch darin, dass ich den Code komprimiert darstellen MUSS! Wiederholungen zum Beispiel darf es nicht geben, die sollen zusammengefasst werden in einem Algorithmus.
Kann ich die Aufgabe nun mitstrstr
lösen?
-
Naja, du könntest hingehen und es eben keine allgemeingültige Stringersetzung schreiben. Deine Aufgabe gibt dir einige wenige vor. Auffällig ist, dass es immer ein-Zeichen und zwei-Zeichen Strings sind, damit kann man fast eben die beschriebene Worstcase Methode wählen.
Das ist unschön, aber würde der Aufgabe genüge tun.
-
@codinglea magst du mal deine Lösung(en) zu einer der anderen Aufgaben zeigen?
-
eigentlich musst du ja in str1 nur den ersten buchstaben von str2 suchen.
wenn du ihn gefunden hast, musst du überprüfen, ob alle weiteren buchstaben von str2 danach auch noch vorkommen.
wenn dem so ist, kopierst du alle buchstaben vor dem ersten auftauchen von str2 in einen puffer.
dann kopierst du alle buchstaben von str3 in den puffer.
danach kopierst du alle buchstaben von str1 nach dem letzten buchstaben von str2 in den puffer.
zum schluss kopierst du alle buchstaben aus dem puffer nach str1.
das ganze wiederholst du dann ab der stelle nach dem letzten buchstaben von str3 bis zum ende von str1.flussdiagramm erstellen und danach programmieren. wenn es dann funktioniert, musst du natürlich noch die fehlerbehandlung (zu wenig speicher usw.) umsetzen.
-
Das ist die Lösung der beiden vorherigen Aufgaben.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { printf("1. Variante\n"); // 1. Variante char string1[] = "Dies ist ein Test zur Kontrolle!"; char *pointer; int i; printf("Vorher: %s\n", string1); // Vorher for(i=0; string1[i]!='\0'; i++) // 'e' Entfernung & Zeichenkürzung { if(string1[i]=='e') { pointer = &string1[i+1]; string1[i] = 0; strcat(string1, pointer); } } printf("Nachher: %s\n\n", string1); // Nachher printf("2. Variante\n"); // 2. Variante char string2[] = "-Dies ist ein #toller #Test!-"; char *zeiger; int j; printf("Vorher: %s\n", string2); // Vorher for(j=0; string2[j]!='\0'; j++) { if(string2[j]=='#'||string2[j]=='!'||string2[j]=='-') // Sonderzeichen entfernt { zeiger = &string2[j+1]; string2[j] = 0; strcat(string2, zeiger); j--; } } printf("Nachher: %s\n\n", string2); // Nachher return 0; }
-
@Wade1234
Puh, das klingt ganz schön anspruchsvoll mit dem ganzen Hin und Her UND nach sehr viel Wiederholung, die ich wenn dann komprimieren muss.
-
@codinglea Deine 1. Variante kommt mit "ee" nicht klar, da wird immer nur eins gelöscht.
Und deine 2. Variante löscht nicht, wie in der Aufgabe vorgegeben, alle Sonderzeichen, sondern nur "#", "!" und "-"
-
Ohne
strcat
und auch inplace (und ungetestet):int j; for(i=0, j=0; string1[i]!='\0'; i++) // Zeichen Entfernung & Zeichenkürzung { if(string1[i]!='e') // if (isalpha(string1[i])) { string1[j] = string1[i]; j++; } } string1[j] = 0;
isalpha
ist in <ctype.h> deklariert.
-
@Schlangenmensch
Eine Lösung für alle Sonderzeichen weiß ich leider nicht.
-
Dann schau dir mal alle Funktionen aus ctype.h an (und kombiniere sie entsprechend).