Seite 1 von 2
Ersetzen von Zeichenketten
Verfasst: Sa Feb 07, 2015 1:41 pm
von Johnny_Truelove
A2)
Schreiben Sie ein Programm mit folgender Leistung
:
Eine Zeichenkette von maximal 20 Zeichen wird einge
lesen, wobei man annehmen darf, dass die
eingegebene Zeichenkette keine Leerzeichen enthält.
Wenn in der eingelesenen Zeichenkette die Doppelvok
ale "au", "Au", "aU" oder "AU" auftreten, werden si
e
durch die Kombinationen "ei", "Ei", "eI" bzw. "EI"
ersetzt.
Die Gesamtanzahl der dabei ersetzten Zeichen und di
e geänderte Zeichenkette werden ausgegeben.
Lösungsbeispiele:
Eingabe: Ausgabe:
Faust 2 Feist
Augenhaut 4 Eigenheit
Natriumhydrogencarbonat 0 Natriumhydrogencarbo (wi
rd abgeschnitten!)
Sitze seid gestern schon auf dieser Aufgabe, bekomme es aber einfach nicht hin. Da in der Prüfung sehr wahrscheinlich so eine ähnliche Aufgabe dran kommen könnte, würde ich gerne jmd um Rat bitten.
Re: Ersetzen von Zeichenketten
Verfasst: Sa Feb 07, 2015 2:39 pm
von nufan
Wie sieht denn dein aktueller Versuch aus das Problem zu lösen?
Re: Ersetzen von Zeichenketten
Verfasst: Sa Feb 07, 2015 5:31 pm
von Johnny_Truelove
Hier mein Programm :
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int replace_character(char* string, char from, char to)
{
int result = 0;
if (!string) return 0;
while (*string != '\0')
{
if (*string == from)
{
*string = to;
result++;
}
string++;
}
return result;
}
int main(void)
{
char text[20];
int result;
printf("\nZeichenkette: ");
fgets(text,20,stdin);
result = replace_character(text, 'au', 'ei ');
result = replace_character(text, 'Au', 'Ei ');
result = replace_character(text, 'aU', 'eI ');
result = replace_character(text, 'AU', 'EI ');
printf("%u Ersetzungen: %s\n", result, text);
return 0;
}
Habe mir im Internet eine Vorlage herausgesucht und es dann bearbeitet, das Ergebnis seht ihr morgen. Das Programm öffnet sich zwar, doch arbeitet nicht korrekt. Das Programm sieht mir etwas kompliziert aus, gibt es vielleicht eine einfachere Option. Kann man ohne Pointer und Funktion ein Programm schreiben, was das selbe Problem löst ? Hoffe, dass mir einer weiterhelfen kann.
MfG Johnny_Truelove
Edit by cloidnerux: Code-Tags, formatierung
Re: Ersetzen von Zeichenketten
Verfasst: Sa Feb 07, 2015 6:07 pm
von cloidnerux
Kann man ohne Pointer und Funktion ein Programm schreiben
Kann man, das macht es aber nicht so viel einfacher.
Statt per Pointer auf den String zugreifen den String als Array nutzen:
Re: Ersetzen von Zeichenketten
Verfasst: So Feb 08, 2015 2:15 am
von Johnny_Truelove
Also die Zeichen werden zwar ausgetauscht, doch gibt das Programm nicht wieder, wie viele Zeichen es ausgetauscht hat. Kann mir da jmd helfen ?
Also ganz werden die Zeichen doch nicht ausgetauscht, bei dem Wort Augenhaut wird nur Aigenhait anstatt Eigenheit ausgegeben.
MfG Johnny_Truelove
Re: Ersetzen von Zeichenketten
Verfasst: So Feb 08, 2015 2:45 am
von cloidnerux
Also die Zeichen werden zwar ausgetauscht, doch gibt das Programm nicht wieder, wie viele Zeichen es ausgetauscht hat. Kann mir da jmd helfen ?
Also ganz werden die Zeichen doch nicht ausgetauscht, bei dem Wort Augenhaut wird nur Aigenhait anstatt Eigenheit ausgegeben.
Das ist genau das, was du auch programmiert/kopiert hast!
Wenn du dir die Signatur der Funktion anschaust:
Code: Alles auswählen
int replace_character(char* string, char from, char to)
Dann übergibst du einen String(char*) und zwei Zeichen. Ein Zeichen ist 'a'-'z', 'A'-'Z', '0'-'9' und andere.
'Ai' ist kein Zeichen, sondern ein String, weil es mehr als zwei Zeichen beinhaltet.
Um nun deine Zeichenketten zu ersetzen brauchst du eine Funktion, die 3 Strings(string, from, to) entgegen nimmt, den String "from" in "string" sucht und alle Vorkommnisse mit "to" ersetzt.
Re: Ersetzen von Zeichenketten
Verfasst: So Feb 08, 2015 1:44 pm
von Johnny_Truelove
Wie würde es dann ungefähr aussehen ? Kannst du mir eine kleine Hilfestellung geben ?
Re: Ersetzen von Zeichenketten
Verfasst: So Feb 08, 2015 2:09 pm
von cloidnerux
Auch hier greift wieder das Prinzip: Teile und Herrsche:
Strings in anderen zu ersetzten besteht aus zwei Teilproblemen:
Den zu ersetzenden String finden und
Die Gefundenen Vorkommnisse zu ersetzen.
Kümmern wir uns erst um Punkt 2:
Wie ersetze ich einen Teil eines Strings? Indem ich ihn überschreibe:
Code: Alles auswählen
char * string = "Das ist ein super toller sample Text!";
char * replace = "test";
int offset = 0;
for(int i = 0; i < strlen(replace); i++)
{
string[offset + i] = replace[i];
}
Nun musst du nur noch alle Vorkommnisse eines strings innerhalb eines anderen finden, das kann man z.B so machen:
Code: Alles auswählen
char * string = "Das ist ein super toller sample Text!";
char * from = "Da";
for(int i = 0; i < (strlen(string) - strlen(from)); i++)
{
if(strcmp(string+i, from) == 0)
//wir haben ein Vorkommnis an der Stelle i gefunden.
}
Wenn man nun beide Teilprobleme gelöst hat, kann man beides zusammen fügen und das Gesamtproblem lösen.
für die Funktionsweise der verwendeten Funktionen "strlen" und "strcmp" verweise ich dich mal auf das Wiki:
https://www.proggen.org/doku.php?id=c:lib:string:start
Re: Ersetzen von Zeichenketten
Verfasst: Do Feb 12, 2015 12:26 am
von Johnny_Truelove
Habe es nochmal versucht, hier mein Ergebnis :
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
void tausche(char *text,char *replace)
{
int offset=0;
int i=0;
for(i=0;i<strlen(replace);i++)
{
text[offset+i] = replace[i];
}
}
main()
{
char text[20];
printf("\nBitte einen Satz eingeben\n");
fgets(text,20,stdin);
tausche(text);
printf("%s",text);
}
folgende Fehlermeldung erhalte ich:
Code: Alles auswählen
bspl0062.c: In function ‘main’:
bspl0062.c:22:3: error: too few arguments to function ‘tausche’
bspl0062.c:4:6: note: declared here
Edit by cloidnerux: Code-Tags
Re: Ersetzen von Zeichenketten
Verfasst: Do Feb 12, 2015 6:50 am
von cloidnerux
folgende Fehlermeldung erhalte ich:
Was sagt dir die Fehlermeldung?
Was steht in Zeile 22?
Das Schöne am Programmieren ist, dass dir dein Compiler genau sagt, was ihn stört. Von daher lohnt es sich immer, die Fehlermeldungen aufmerksam durchzulesen.