Vokale ersetzen in C mit Hilfe von Pointern

...komplette Frage anzeigen

1 Antwort

Ok, dann schauen wir uns mal die Aufgabenstellung an:

Erstellen Sie ein C Programm, das mit Hilfe von Zeigern einen eingegebenen Text nach entsprechender Eingabeaufforderung nach Vokalen "aeiou" durchsucht und dann mit einem vorher eingegebenen Vokal ersetzt.

Könnte ein wenig Korinthenk*ckerei sein von deiner Professorin, aber du durchsuchst deinen Text mit einem Index gemäß des ersten Zeichens.

C-Strings SIND Zeiger.

Nein, sind sie nicht. Strings in C sind Null-terminierte Character-Arrays. Der Name dieses Character-Arrays ist gleichzeitig auch ein Zeiger auf das Element Array[0]. Wie gesagt, erscheint mir durchaus etwas kleinkariert, aber du greifst eben auf eingabe[i] zu und das ist ein direkter Zugriff auf ein einzelnes Char-Element des Arrays. Möglicherweise will deine Prof etwas mit char* sehen.

Dann wären die Arraydefinitionen mehr in der Richtung:

int main()
{
    char* eingabe;
    char* ausgabe;
    char* vokal;

    eingabe = (char*) malloc(sizeof(char) * 100);
    ausgabe = (char*) malloc(sizeof(char) * 100);
    vokal = (char*) malloc(sizeof(char));
...
}

Das wäre dann dynamische Speicherverwaltung und die läuft dann wirklich nur noch mit Zeigern ab. Nicht vergessen, abschließend den reservierten Speicher mit free() wieder freizugeben, sonst gibt's garantiert Punkteabzug. :)

In deiner Textersetzung könntest du dann ggf. ziemlich brutal arbeiten mit Konstrukten wie:

for(int i = 0;  *(eingabe + i) != 0; i++)
 {
        if(*(eingabe + i) == 'A' || 
           *(eingabe + i) == 'E' || 
           *(eingabe + i) == 'I' || 
           *(eingabe + i) == 'O' || 
           *(eingabe + i) == 'U')
        {
            *(ausgabe + i) = *vokal;
        }
...
    }

Ist allerdings ohne Gewähr, dass das funktioniert, da ich derzeit zu faul bin, das durch einen Compiler zu jagen. Aber der Grundgedanke ist einfach der, dass du wirklich nur noch mit der jeweiligen Pointeradresse (eingabe) plus dem Index (i) arbeitest. Da du mit einem Char-Array werkelst, kannst du einfach die Speicheradresse (eingabe) direkt inkrementieren. Um dann auf den Inhalt der jeweiligen Speicheradresse zuzugreifen, brauchst du das Sternchen vor dem Ausdruck - wenn ich das noch richtig in Erinnerung habe.

Ich vermisse noch ein wenig die Prototypdeklaration. Du hast dein textersetzen einfach vor die main() gesetzt und fertig. Damit hast du aber eine direkt Funktionsdeklaration (die so natürlich funktioniert), aber keine Prototypdeklaration.

Dann heisst es noch in der Aufgabenstellung:

Der Rückgabewert der Funktion ist 1, wenn mindestens 1 Buchstabe geändert wurde, er ist 0 wenn kein Buchstabe geändert wurde.

Deine text_ersetzen() hat aber Rückgabewert void. Das kann so also schon mal ganz sicher nicht stimmen. ;)

Beachten Sie: auch Großbuchstaben AEIOU sollen ersetzt werden und Sie müssen die Textersetzung mit Hilfe von Zeigern formulieren.

Die Großbuchstaben beachtest du, aber da steht's nochmal explizit drin: Textersetzung mit Hilfe von Zeigern. Da kann man sich noch bitterböse austoben, z.B. indem man die zu ersetzenden Vokale ebenfalls in ein Array packt und dann mit einem zweiten Index und Pointer immer durch dieses Array rast und vergleicht. Ich versuch mich mal an einer entsprechenden Formulierung:

int textersetzung(char* eingabe, char* vokal, char* ausgabe)
{
    int i, j, result;

    char to_replace[10] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};

    result = 0;

    for(i = 0;  eingabe[i] != 0; i++)
    {
        for(j = 0; j < 10; j++)
        {
            if(*(eingabe + i) == *(to_replace + j)
            {
                *(ausgabe + i) = *vokal;
                result = 1;
            }
            else
            {
                *(ausgabe + i) = *(eingabe + i);
            }
        }

    }

    getchar();
    getchar();
    returm result;
}

Und vergiß auch nicht:

Die main Funktion gibt den geänderten Text aus, falls eine Ersetzung gemacht wurde, ansonsten 'Keine Aenderung'.

Das soll in der main() geschehen, nicht in der textersetzung().

Das mal so als evtl. Denkansätze von meiner Seite. Und zum Code - wie gesagt: Ohne Gewähr.

Was möchtest Du wissen?