Zum Inhalt springen

Schleife rückwärts laufen lassen


Psycho~zicke

Empfohlene Beiträge

Hallöchen ihr lieben!

Ich hab mal wieder ein Problem und hoffe das ihr mir helfen könnt. Ich habe ein Programm geschrieben und möchte in einem satz zb dir durch ihnen ersetzen... Ihnen ist aber länger wie dir und genau da kommt mein Problem. Ich überschreibe mir dann die ersten beiden Buchstaben des nächsten wortes.

Ich hab mir gedacht, das man das anstatt ne schleife hoch zu zählen die bis zu einer gewissen Position rückwärts laufen lassen kann, so das sie an der richtigen stelle mit dem gewünschten Buchstaben wieder anfängt den Satz im Array auszugeben bzw anzusammeln bevor es ausgeben wird.

Ich hoffe ihr versteht was ich meine... Schreib euch mal meinen Quelltext mit dazu evt kann mir ja jemand nen rat geben wie ich das am besten anpack...

#include <stdio.h>

#include <string.h>

#define MAXLINE 15


void main ()

{

    // deklaration der Variablen

    int iEingabe;

    char sZeile [50];

    int iZaehler;

    int iSpalte;

    int iLeerPos;

    int iSchleife;

    int iPos;


    // Zuordnung der Werte

    iEingabe = 'w';

    iZaehler = 0;

    iSpalte = 0;

    iLeerPos = 0;

    iSchleife = 0;

    iPos = 0; 


    while (iEingabe !='A')  // Wird ausgeführt solange iEingabe nicht A ist

    {

        iEingabe = getchar();       // Übergabe der Werte an iEingabe

        sZeile [iZaehler] = iEingabe;   // Übergabe der Werte an sZeile 

        //++ iZaehler;

        if (iEingabe == ' ')    //Überprüfung ob iEingabe  ein Leerzeichen ist

        {   

            iLeerPos = iZaehler;    // iLeerPos bekommt den Wert von iZaehler und behält ihn so lange bis iZaehler wieder ein Leerzeichen ist.

        }

        if (iSpalte >= MAXLINE)     // Überprüfung ob iSpalte größer/gleich MAXLINE ist

        {

            sZeile[iLeerPos] = '\n';    // sZeile gibt ein zeilentrenner aus wenn iSpalte größer/gleich MAXLINE ist

            iSpalte = -1;       // iSpalte bekommt den wert -1 damit iSpalte nach dem Zeilentrenner wieder bei 0 beginnt. -1 Weil iSpalte gleich unten drunter wieder um 1 hochgezählt wird.

        }

        ++ iZaehler;    // iZaehler wird hochgezählt

        ++ iSpalte;     // iSpalte wird hochgezählt


    }

    sZeile[iZaehler] = '\0';    //sZeile setz \0 ans ende der Zeichenkette

    iLetztesZeichen = iZaehler +1;    


    while (iSchleife < iZaehler)    // Wird solange ausgeführt wie iSchleife < iZaehler ist

    {   

        if (sZeile[iSchleife] == 'd')   

        {

            iPos = iSchleife;

            ++iSchleife;

            if (sZeile[iSchleife] == 'i')

            {

                ++iSchleife;

                if (sZeile[iSchleife] == 'r')

                {               

                    sZeile[iPos] = 'i';    

                    ++iPos;

                    sZeile[iPos] = 'h';

                    ++iPos;

                    sZeile[iPos] = 'n';

                    ++iPos;

                    sZeile[iPos] = 'e';

                    ++iPos;

                    sZeile[iPos] = 'n';

                    ++iPos;

                    sZeile[iPos] = ' ';

                }

            }

           // sZeile[iSchleife] = 'E';    

        }

        ++iSchleife;    // Zählt iSchleife hoch

    }

    printf ("%s", sZeile);      // gibt die Zeichenkette sZeile aus

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

es gibt fertige Stringfunktionen, die das für Dich machen C++-Programmierung: Strings - Wikibooks

Wenn Du es unbedingt selbst schreiben willst, musst Du ein Pattern Matching implementieren, denn ein "dir" in "direkt" soll ja nicht ersetzt werden.

D.h. Du musst einen neuen String bauen, den Du, wenn Du nicht ersetzt zeichenweise kopierst, falls Du beim lesen einmal komplett Dein Pattern durchlaufen kannst, dann stehst Du ja auf dem Leerzeichen nach einem "dir" und schreibst in den neuen String eben das zu ersetzende Wort

HTH Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja man müsste schon nach " dir ", " dir. ", " dir, ", " dir! ", " dir? ", " dir: ", " dir; " suchen anstatt nur nach "dir ". Das Leerzeichen davor ja ist auch wichtig. Zum Finden/Ersetzen benutz lieber die schon vorhandenen Funktionen. Ich würde vermutlich eine Liste erzeugen mit dem gesuchten Wort und allen möglichen Zeichenkombinationen am Ende, und dann einfach in einer kleinen Schleife mit find und replace durchrödeln lassen.

Mal ganz abgesehen davon, hat es einen gewissen Grund dass du die Eingabe über einen int und nicht gleich über char machst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal ganz abgesehen davon, hat es einen gewissen Grund dass du die Eingabe über einen int und nicht gleich über char machst?
Ganz einfach: getchar liefert einen int zurück. Wenn man den Wert sofort in eine char-Variable steckt, kann man nicht mehr auf EOF prüfen.

(Dass das hier nicht passiert, ist eine andere Sache ;))

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab das Problem heute Lösen können. Danke für eure Hilfe...

Hätte da noch ne frage uns zwar würde ich gern sowas wie ne abfrage/eingabeaufforderung in das Programm bauen... Also quasi "Bitte geben sie den Satz ein. Welches Wort wollen sie ersetzen. Durch welches Wort wollen sie es ersetzen? Und das dann erst der Satz ausgegeben wird... Hab versucht dies in meinen Quelltext einzubauen aber bis auf die erste frage klappts leider nicht... Wahrscheinlich hab ich die befehle an der Falschen stelle oder so... Wäre lieb wenn mir jemand nen Tip geben könnte... Danke schon mal im vorraus...

#include <stdio.h>

#include <string.h>

#define MAXLINE 40


void main ()

{

    // deklaration der Variablen

    int iEingabe;

    char sZeile [70];

    int iZaehler;

    int iSpalte;

    int iLeerPos;

    int iSchleife;

    int iPos;

    int iZurueck;


    // Zuordnung der Werte

    iEingabe = 'w';

    iZaehler = 0;

    iSpalte = 0;

    iLeerPos = 0;

    iSchleife = 0;

    iPos = 0;


    printf("\nBitte geben Sie einen Satz ein\n");

    while (iEingabe !='A')  // Wird ausgeführt solange iEingabe nicht A ist

    {

        iEingabe = getchar();       // Übergabe der Werte an iEingabe

        sZeile [iZaehler] = iEingabe;   // Übergabe der Werte an sZeile 

        if (iEingabe == ' ')    //Überprüfung ob iEingabe  ein Leerzeichen ist

        {   

            iLeerPos = iZaehler;    // iLeerPos bekommt den Wert von iZaehler und behält ihn so lange bis iZaehler wieder ein Leerzeichen ist.

        }

        if (iSpalte >= MAXLINE)     // Überprüfung ob iSpalte größer/gleich MAXLINE ist

        {

            sZeile[iLeerPos] = '\n';    // sZeile gibt ein zeilentrenner aus wenn iSpalte größer/gleich MAXLINE ist

            iSpalte = -1;       // iSpalte bekommt den wert -1 damit iSpalte nach dem Zeilentrenner wieder bei 0 beginnt. -1 Weil iSpalte gleich unten drunter wieder um 1 hochgezählt wird.

        }

        ++ iZaehler;    // iZaehler wird hochgezählt

        ++ iSpalte;     // iSpalte wird hochgezählt

    }

    sZeile[iZaehler] = '\0';    //sZeile setz \0 ans ende der Zeichenkette

    printf ("\nWelches Wort wollen Sie ersetzen?\n");

    while (iSchleife < iZaehler)    // Wird solange ausgeführt wie iSchleife < iZaehler ist

    {       

        if (sZeile[iSchleife] == 'd')   // Prüft auf welcher Position ein d ist

        {

            iPos = iSchleife;   //übergabt der Position des d´s an iPos

            ++iSchleife;        // iSchleife wird hochgezählt

            if (sZeile[iSchleife] == 'i') // Prüft ob der nächste buchstabe ein i ist

            {

                ++iSchleife;    // iSchleife wird hochgezählt

                if (sZeile[iSchleife] == 'r')   // Prüft ob der nächste buchstaben ein r ist

                {

                printf ("Durch welches Wort wollen Sie ersetzen?\n");

                iZurueck = iZaehler;    // Über gabe der letzten Position des strings an iZurueck

                while (iZurueck != iPos)        //wird solange ausgeführt wie iZurueck nicht den selben Wert wie iPos hat

                {

                    sZeile[iZurueck +2] = sZeile[iZurueck];     // Übergabe des Wertes +2 um die 2 Fehlenden Zeichen zu überbrücken

                    -- iZurueck;    // iZurueck wird runter gezählt

                }

                sZeile[iPos] = 'i';    // an aktuelle Position von iPos kommt ein i

                ++iPos;         // iPos wird dochgezählt

                sZeile[iPos] = 'h'; // an aktuelle Position von iPos kommt ein h

                ++iPos;     // iPos wird hochgezählt

                sZeile[iPos] = 'n'; // an aktuelle Position von iPos kommt ein n

                ++iPos;     // iPos wird hochgezählt

                sZeile[iPos] = 'e'; // an aktuelle Position von iPos kommt ein e

                ++iPos;         // iPos wird hochgezählt

                sZeile[iPos] = 'n'; // an aktuelle Position von iPos kommt ein n

               }

            }   

        }

        ++iSchleife;    // Zählt iSchleife hoch

    }

    printf ("%s", sZeile);      // gibt die Zeichenkette sZeile aus

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab versucht dies in meinen Quelltext einzubauen aber bis auf die erste frage klappts leider nicht...
"Klappt leider nicht" ist keine ausreichende Fehlerbeschreibung.

Wenn du Benutzereingaben auswerten willst, solltest du zunächst mal welche einlesen. Variablen, die diese Eingaben aufnehmen, wären auch keine schlechte Idee. Das kannst du genauso machen wie für den Text selbst (wenn du denn immer noch kein scanf/fgets benutzen willst). Man könnte das dann auch schön in eine Funktion auslagern.

Übrigens, mit solchen Kommentaren wie diesem hier:

++iSchleife; // iSchleife wird hochgezählt
machst du es dir selbst nur unnötig schwer. Dein Code ist übersät mit Kommentaren, die nichts aussagen, zumindest nicht mehr, als der Code selbst. Das ist nicht der Sinn von Kommentaren. Dass hier iSchleife hochgezählt wird, sehe ich selbst, dafür brauche ich keinen Kommentar. Interessant sind Kommentare, wenn sie aussagen, warum etwas passiert, damit man leichter versteht, wie das Programm funktioniert.

Deine Kommentare sind nur eine 1:1-Übersetzung des Codes, ohne Zusatzinformation. Sie machen das Ganze nur unübersichtlicher.

Es gilt übrigens immer noch: Wenn du ein Wort durch ein eines mit anderer Länge ersetzen willst, ohne ein zweites Array zu benutzen, musst du die Zeichen hinter der Ersetzungsstelle entsprechend verschieben. Daran führt kein Weg vorbei.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...