Ersetzen von Zeichenketten

Schnelle objektorientierte, kompilierende Programmiersprache.
Johnny_Truelove
Beiträge: 9
Registriert: Sa Feb 07, 2015 11:42 am

Ersetzen von Zeichenketten

Beitrag von Johnny_Truelove » Sa Feb 07, 2015 1:41 pm

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.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Ersetzen von Zeichenketten

Beitrag von nufan » Sa Feb 07, 2015 2:39 pm

Wie sieht denn dein aktueller Versuch aus das Problem zu lösen?

Johnny_Truelove
Beiträge: 9
Registriert: Sa Feb 07, 2015 11:42 am

Re: Ersetzen von Zeichenketten

Beitrag von Johnny_Truelove » Sa Feb 07, 2015 5:31 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ersetzen von Zeichenketten

Beitrag von cloidnerux » Sa Feb 07, 2015 6:07 pm

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:

Code: Alles auswählen

string[i] = to;
Redundanz macht wiederholen unnötig.
quod erat expectandum

Johnny_Truelove
Beiträge: 9
Registriert: Sa Feb 07, 2015 11:42 am

Re: Ersetzen von Zeichenketten

Beitrag von Johnny_Truelove » So Feb 08, 2015 2:15 am

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ersetzen von Zeichenketten

Beitrag von cloidnerux » So Feb 08, 2015 2:45 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Johnny_Truelove
Beiträge: 9
Registriert: Sa Feb 07, 2015 11:42 am

Re: Ersetzen von Zeichenketten

Beitrag von Johnny_Truelove » So Feb 08, 2015 1:44 pm

Wie würde es dann ungefähr aussehen ? Kannst du mir eine kleine Hilfestellung geben ?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ersetzen von Zeichenketten

Beitrag von cloidnerux » So Feb 08, 2015 2:09 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

Johnny_Truelove
Beiträge: 9
Registriert: Sa Feb 07, 2015 11:42 am

Re: Ersetzen von Zeichenketten

Beitrag von Johnny_Truelove » Do Feb 12, 2015 12:26 am

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ersetzen von Zeichenketten

Beitrag von cloidnerux » Do Feb 12, 2015 6:50 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten