Psycho~zicke Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 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 } Zitieren
flashpixx Geschrieben 4. Dezember 2007 Geschrieben 4. Dezember 2007 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 Zitieren
qat Geschrieben 5. Dezember 2007 Geschrieben 5. Dezember 2007 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? Zitieren
Klotzkopp Geschrieben 5. Dezember 2007 Geschrieben 5. Dezember 2007 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 ) Zitieren
Psycho~zicke Geschrieben 5. Dezember 2007 Autor Geschrieben 5. Dezember 2007 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 } Zitieren
Klotzkopp Geschrieben 6. Dezember 2007 Geschrieben 6. Dezember 2007 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ähltmachst 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. Zitieren
Empfohlene Beiträge
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.