String einlesen und Zeichen zählen

So,
ich denke, dass ich die Endlosschleife und alle anderen Probleme raushaben sollte.
Das mit dem Replace von der cplusplus-Seite hab ich auch gecheckt. Aber ich will ja nicht den ganzen Satz mit einem anderen, wo die "e"s durch "o"s wurden überschreiben. Ich will ja lediglich, dass in dem String die "e"s gefunden werden und überschrieben werden.
Mein Programm sieht jetzt übrigens so aus:

PS: Das mit der Replace Funktion ist nur so dahingeschrieben zum Probieren.

#include <string>
#include <iostream>



using namespace std;

int main ()


// Satzeingabe
{
string satz = "Drei Chinesen mit dem Kontrabass.";


char c;
int laenge = satz.size();



char buchstabe;
cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
cin >> buchstabe;



int anzahl = 0;

for(int i=0; i<laenge; i++)
{
if(satz==buchstabe) anzahl++;
}

cout << "\n\nDie Laenge des Strings ist: " << laenge;
cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll

char ans;
do
{
cout<< "Willst du noch ein Zeichen ersetzen? (j/n)?\n";
cout<< "Tippe 'j' oder 'n'.\n";
cin >> ans;
}
while((ans !='j')&&(ans !='n')&&(ans !='j')&&(ans !='n'));


// Zeichen im String ersetzen

string satz2 = "Drei Chinesen mit dem Kontrabass.";
string str=satz2;
str.replace("e","o");

cout << str << endl;
return 0;


}



Alternativ habe ich noch was anderes gefunden.
Da wird mir aber angezeigt, dass er #include "ReplaceAll.h" nicht öffnen kann.
Außerdem müsste ich dann ja immer bei "assert" den fertigen Satz selber aufschreiben, was ja eigentlich automatisch geschehen sollte.


#include <string>
#include <iostream>
#include <cassert>
#include "ReplaceAll.h"



using namespace std;

int main ()


// Satzeingabe
{
string satz = "Drei Chinesen mit dem Kontrabass.";


char c;
int laenge = satz.size();



char buchstabe;
cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
cin >> buchstabe;



int anzahl = 0;

for(int i=0; i<laenge; i++)
{
if(satz==buchstabe) anzahl++;
}

cout << "\n\nDie Laenge des Strings ist: " << laenge;
cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll

char ans;
do
{
cout<< "Willst du noch ein Zeichen ersetzen? (j/n)?\n";
cout<< "Tippe 'j' oder 'n'.\n";
cin >> ans;
}
while((ans !='j')&&(ans !='n')&&(ans !='j')&&(ans !='n'));


// Zeichen im String ersetzen


string satz2 = "Drei Chinesen mit dem Kontrabass.";
replaceAll(satz2 "e", "o");
assert(satz2 == "Droi Chinoson mit dom Kontrabass");



}
 
Zuletzt bearbeitet:
replaceAll.h ist auch eine selbstgeschriebe Datei, und replaceAll() ist eine vom Programmierer selbst definierte Funktion.
Also:Du hast seinen Quellcode nicht->du kannst die Sache nicht so schreiben wie er, oder du schreibst replaceall selbst.

Deine Bedingungen zum weiterführen der Schleife machen, keinen Sinn.

Du rufst string::replace immer noch falsch auf.
Viel erfolg bei deinem Projekt.
mfg

sw33t
 
Soooo,
immerhin wird mir jetzt kein Fehler mehr angezeigt.
Aber leider passiert nach der Eingabe von "j" oder "n" nix mehr.
Mein Programm sieht jetzt so aus:

#include <string>
#include <iostream>






using namespace std;

int main ()


// Satzeingabe
{
string satz = "Drei Chinesen mit dem Kontrabass.";


char c;
int laenge = satz.size();



char buchstabe;
cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
cin >> buchstabe;



int anzahl = 0;

for(int i=0; i<laenge; i++)
{
if(satz==buchstabe) anzahl++;
}

cout << "\n\nDie Laenge des Strings ist: " << laenge;
cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll

char ans;
do
{
cout<< "Willst du noch ein Zeichen ersetzen? (j/n)?\n";
cout<< "Tippe 'j' oder 'n'.\n";
cin >> ans;
}
while((ans !='j')&&(ans !='n')&&(ans !='j')&&(ans !='n'));


// Zeichen im String ersetzen

string satz2 = "Drei Chinesen mit dem Kontrabass.";
int pos;
cin >> satz2;
while((pos = satz2.find('e'))!=string::npos)satz2[pos] = 'i';


}
 
Zuletzt bearbeitet:
Mach das Menü doch einfach so:

Code:
cin >> eingabe;


if(eingabe==j) { Teil für das ersetzen};
if (eingabe==n) { cout << "Dann nicht!"};
else cout << "Falsche Eingabe);
 
@landrix:
deinen vorschlag kann ich irgendwie nicht vernünftig umsetzen.

mir fehlt ja lediglich der übergang zwischen der do while abfrage und dem teil mit dem ersetzen und das bekomme ich absolut nicht hin.

#include <string>
#include <iostream>







using namespace std;

int main ()


// Satzeingabe
{
string satz = "Drei Chinesen mit dem Kontrabass.";


char fortfahren[3];
char c;
int laenge = satz.size();



char buchstabe;
cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
cin >> buchstabe;



int anzahl = 0;

for(int i=0; i<laenge; i++)
{
if(satz==buchstabe) anzahl++;
}

cout << "\n\nDie Laenge des Strings ist: " << laenge;
cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll

do
{
cout << "Zum Fortfahren des Programms tippe \"ja\" (tippe \"nein\" um das Programm zu schliessen)" << endl;
cin >> fortfahren;
}
while(strcmp(fortfahren,"ja") != 0 && strcmp(fortfahren,"nein")!=0);
if(strcmp(fortfahren,"no") == 0)
{
cout << "Programm geschlossen" << endl;
}
else

!!!!!!!Hier muss irgendwie der Übergang hin!!!!!
// Zeichen im String ersetzen

{string satz2 = "Drei Chinesen mit dem Kontrabass.";
int pos;
cin >> satz2;
while((pos = satz2.find('e'))!=string::npos)satz2[pos] = 'i';

}



}
 
@landrix:
deinen vorschlag kann ich irgendwie nicht vernünftig umsetzen.

mir fehlt ja lediglich der übergang zwischen der do while abfrage und dem teil mit dem ersetzen und das bekomme ich absolut nicht hin.
toasting in an epic bread

du solltest dich mal zwischen C und C++ entscheiden. strcmp ist C. In C++ ist es eine Methode von String (compare)... also wird es auf Objekte dieser aufgerufen ... text.compare(text2). Dein Satz ist ein C++ String aber deine Eingabe wird ein C String. Ansonsten schreibst du oben char fortfahren[3]; ... unten forderst du den Benutzer "ja" oder "nein" einzugeben. Das Wort "nein" hat offensichtlich 4 Buchstaben. Ich rate dir komplett C++ Strings benutzen.

Anstatt einer Schleife kannst du doch einfach ein if benutzen ... erst Ausgabe a la "möchten sie ersetzen(ja) oder beenden(nein)" ... wenn ja dann return, wenn nein dann ersetzen ... hier ein idiotensicheres Tutorial für Herr If und Frau Else http://tutorial.schornboeck.net/if.htm
 
Zuletzt bearbeitet:
Wenn die Aufgabenstellung lautet, Du sollst die Stringlänge selbst bestimmen, darfst Du natürlich nicht auf fertige String-Funktionen/Methoden wie strcmp(), strlen() und dergleichen zugreifen, denn diese beinhalten ja genau das, was Du selbst programmieren sollst.

Hier meine Pointer-Lösung:
Code:
#include <stdio.h>

char s[]="This is a String";

int main(void) {
  const char x='i', y='X';
  int len=0, c=0;
  char *p=(char*)s;

  while (*(p)++!='\0') {
    len++;
    if (*p==x) {
      c++;
      *p=y;
    }
  }
  printf("str. laenge via sizeof(): %d\n", sizeof(s)-1);
  printf("str. laenge via pointer:  %d\n", len);
  printf("zeichen '%c' wurde %d mal gefunden und durch %c ersetzt\n",x,c,y);
  printf("neuer string: %s\n", s);
  return 0;
}
Ausgabe:
str. laenge via sizeof(): 16
str. laenge via pointer: 16
zeichen 'i' wurde 3 mal gefunden und durch X ersetzt
neuer string: ThXs Xs a StrXng
Greetz
Hackse
 
@hackse:
hehe danke für deinen kommentar. aber ich glaube, wenn ich sowas bei meinem professor abliefer, wird der sich erst an den kopf fassen und mir dann getrost eine runterhauen, weil er genau weiß, dass ich zu sowas niemals im stande gewesen wäre :D

@chumbalum:

dir auch danke. ich werd mich mal die nächsten tage daran setzen und versuchen den haufen nen bissel umzukrempeln (ohne zu verzeifeln ;))
 
Leute,
ich stehe hier kurz vorm Verzweifeln.

Mein Code sieht jetzt so aus. Aber dennoch werden mir 4 Fehler angezeigt.
Ich bitte inständig um Hilfe, weil ich sonst in die Tastatur beiße!!!
Danke.

Code:
#include <string>
#include <iostream>




using namespace std;

int main ()


// Satzeingabe
{
    string satz = "Drei Chinesen mit dem Kontrabass.";

    
    char c;
    int laenge = satz.size();



    char buchstabe;
    cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
    cin >> buchstabe;



    int anzahl = 0;
    
    for(int i=0; i<laenge; i++)
    {
    if(satz[i]==buchstabe) anzahl++;
    }

    cout << "\n\nDie Laenge des Strings ist: " << laenge;
    cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll
// Zeichen im String ersetzen

    char eingabe;
    char j;
    char n;
    cin >> eingabe;
    
    


    if(eingabe==j) 

    { string satz2 = "Drei Chinesen mit dem Kontrabass.";
     int pos;
     cin >> satz2;
     while((pos = satz2.find('e'))!=string::npos)satz2[pos] = 'i';};

    if (eingabe==n) { cout << "Das Programm wird beendet"};
    else cout << "Falsche Eingabe);


 
}
 
Nun,
die Syntax-Fehler sind korrigiert:

Code:
#include <string>
#include <iostream>




using namespace std;

int main ()


// Satzeingabe
{
    string satz = "Drei Chinesen mit dem Kontrabass.";

    
    char c;
    int laenge = satz.size();



    char buchstabe;
    cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
    cin >> buchstabe;



    int anzahl = 0;
    
    for(int i=0; i<laenge; i++)
    {
    if(satz[i]==buchstabe) anzahl++;
    }

    cout << "\n\nDie Laenge des Strings ist: " << laenge;
    cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll
// Zeichen im String ersetzen


    char eingabe;
    // Eine (!) Variable um auf 'j' oder 'n' zu testen genuegt.
    cin >> eingabe;

    if(eingabe=='j') // Pruefung auf das Literal 'j', nicht auf die Variable <j>

    { string satz2 = "Drei Chinesen mit dem Kontrabass.";
     int pos;
     cin >> satz2;
     while((pos = satz2.find('e'))!=string::npos)satz2[pos] = 'i';};

    if (eingabe=='n') // Klammerfehler korrigiert, Variable durch Literal ersetzt
      cout << "Das Programm wird beendet";
    else 
      cout << "Falsche Eingabe"; // Tippfehler korrigiert 


 
}

Dennoch sind dort noch einige anderen Fehler drin. Wenn Du nicht weiter kommst, sag' bescheid.

Greetz
Hackse
 
Vielen Dank, Hackse für die Korrektur.
Mein Programm sieht jetzt so aus. Aber leider scheint immernoch der Fehler in dem Ersetzen-Teil zu sein.
Wenn man nach meiner Anfrage "n" tippt, schließt das Programm wie gewollt. Drücke ich "j", passiert rein gar nix. Also muss das ja flasch sein. Nur hab ich das halbe Internet durchforstet und nicht gefunden, wie man diese replace Funktion vernünftig benutzt.

Code:
#include <string>
#include <iostream>




using namespace std;

int main ()


// Satzeingabe
{
    string satz = "Drei Chinesen mit dem Kontrabass.";

    
   
    int laenge = satz.size();



    char buchstabe;
    cout << "Waehle einen Buchstaben, um die Anzahl der Zeichen und die Häufigkeit des Buchstaben anzeigen zu lassen: ";
    cin >> buchstabe;



    int anzahl = 0;
    
    for(int i=0; i<laenge; i++)
    {
    if(satz[i]==buchstabe) anzahl++;
    }

    cout << "\n\nDie Laenge des Strings ist: " << laenge;
    cout << "\n\nDie Anzahl ist: " << anzahl << endl;

// Frage, ob noch ein Zeichen ersetzt werden soll
// Zeichen im String ersetzen
    
    

    char eingabe;
    cout<< "Willst du noch ein Zeichen ersetzen? (j/n)?\n";
    cin >> eingabe;

    

    if(eingabe=='j') 

    { string satz2 = "Drei Chinesen mit dem Kontrabass.";
     int pos;
     cin >> satz2;
     while((pos = satz2.find('e'))!=string::npos)satz2[pos] = 'i';};

    if (eingabe=='n') 

      cout << "Das Programm wird beendet";
    else 
      cout << "Falsche Eingabe";
 
Fangen wir mal vorne an:

Es gibt einen <satz>, den man nach Häufigkeit von einem Buchstaben durchsuchen kann. Dann gibt es einen <satz2>, der den selben Text wie <satz> beinhaltet. Warum weist Du ihm nicht gleich <satz> zu, anstatt den selben Text noch mal abzuschreiben?

Du hast eine Variable <pos> mit einem undefinierten Wert, liest <satz2> via <cin> ein, obwohl dieser bereits einen String enthält.

Die while-Bedingung ist falsch,

Es werden plötzlich 'e's und 'i's ersetzt (warum gerade diese beiden Buchstaben?) und zwar ohne Rücksicht auf die vorherige Eingabe des User-Buchstabens im ersten Teil des Programms ...

Du musst Dir angewöhnen alles zu strukturieren. Die Positionierung Deiner Klammern ist irreführend und die beliebig vielen Leerzeilen an ebenso beliebigen Stellen machen das Ganze unleserlich.

Was genau erwartest Du von dem Programm? Schreibe doch mal den Text der Aufgabenstellung 1 zu 1 ab. Dann kann ich Dir bei dem Programm helfen.

Greetz
Hackse
 
Zuletzt bearbeitet:
Hier ist die Lösung:

Code:
#include <string>
#include <iostream>

using namespace std;

int main () {
  string satz = "Drei Chinesen mit dem Kontrabass.";
  int laenge = satz.size(), anzahl=0, pos;
  char buchstabe;
  cout << "Originaler String: "<<satz<<endl;
  cout << "Buchstaben eingeben um Haeufigkeit anzuzeigen: ";
  cin >> buchstabe;
  for(int i=0;i<laenge;i++) if(satz[i]==buchstabe) anzahl++;
  cout << "Stringlaenge: "<<laenge<<endl;
  cout << "Haeufigkeit:  "<<anzahl<<endl;
  char eingabe;
  cout<<"Zeichenersetzung? (j/n)?: ";
  cin >> eingabe;
  switch (eingabe) {
    case 'j': anzahl=0; 
              for (;;) { 
                pos=satz.find('e', pos);
                if (pos==string::npos) break;
                  anzahl++;
                  satz[pos]='i';
              }
              if (anzahl > 0) {
                cout <<"Buchstabe 'e' wurde "<<anzahl<<" Mal durch 'i' ersetzt"<<endl;
                cout << "Neuer Satz: "<<satz<<endl;
              }
              else 
                cout <<"Buchstabe 'e' wurde nicht gefunden"<<endl;
              break;
    case 'n': cout << "Adios"<<endl; break;
    default : cout << "Falsche Eingabe"<<endl; 
  }
  return 0;
}

Greetz
Hackse
 
Danke für die Hilfe, aber leider zeigt mir das Programm nen Debug-Error an, sobald ich "j" nach der Frage eingebe.


Hier ist nochmal meine eigentliche Aufgabenstellung:

Schreiben Sie ein modulares, aus mehreren Funktionen bestehendes Programm, das
• einen String, der aus mehreren Wörtern besteht, über die Tastatur einliest,
• die Länge des Strings bestimmen und anzeigen kann,
• zählen kann, wie oft ein bestimmtes, über die Eingabe bestimmtes Zeichen (z.b. Leerzeichen) vorkommt, und
• ein bestimmtes Zeichen durch ein anderes ersetzen kann (z.B. alle ‚e’ durch ‚i’; beide zeichen sollen eingelesen werden können).
 
• ein bestimmtes Zeichen durch ein anderes ersetzen kann (z.B. alle ‚e’ durch ‚i’; beide zeichen sollen eingelesen werden können).
Diese Bedingung erfüllt Dein Programm aktuell nicht.

Das Programm sollte ohne Warnungen oder Fehler durchlaufen. Welchen Compiler verwendest Du denn? Bitte sende mir die Position des Abbruchs der Debugausgabe.

Greetz
Hackse
 
Ich verwende Visual C++ 2008.
Die Fehlermeldung sieht so aus:

Debug Error!
Programm: ...dio
.
.
.
Run-Time Check Failure #3 - The varibale 'pos' is being used without being initialized



Ich denke mal, dass das nicht so schlimm ist, wenn mein Programm nicht alle Voraussetzungen erfüllen kann.
 
Das ist ja ja lustig. :) Dein Compiler versteht scheinbar nicht, dass man in eine uninitialisierte Variable durchaus schreiben darf, solange diese nicht dynamisch (malloc(), calloc(), ...) erzeugt wurde. Na ja, tausche bitte die zweite Zeile unter main() ...
Code:
  int laenge = satz.size(), anzahl=0, pos;
gegen diese hier aus, damit der Compiler zufrieden ist:
Code:
  int laenge = satz.size(), anzahl=0, pos=0;
Greetz
Hackse
 
Jawoll,
ich kann nicht oft genug Danke sagen.
Jetzt muss ich da nur noch meine chaotische Struktur reinbringe und etliche Absätze machen :D ;)
Danke
 
Wenn Du mal nicht weißt wie (d.h. mit welchen Parametern) eine cpp-Funktion wie z.B. string.find() aufgerufen wird und welche es so gibt, dann kannst Du auf folgender Seite nachsehen:

http://www.cplusplus.com/reference/string/string/find/

Du solltest noch versuchen die 'e's und 'i's gemäß Aufgabenstellung zu parametrisieren, d.h. durch den User eingeben zu lassen welche Zeichen durch welche Zeichen ersetzt werden. Kriegst Du das hin? Wenn schon dann richtig, keine halben Sachen ...

Greetz
Hackse
 
Zurück
Oben