[C++] String Problem

UnBreakable

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
456
Also ich will nun beginnen mit C++ zu Programmieren!
So mit schleifen, usw. funktioniert auch alles recht gut!

Nur jetzt wollte ich ein String in eine Variable einlesen und da hab ich meine ersten probleme!

Ich hab im internet gesucht und gefunden das ich einen Header include muss!

mein code sieht also so aus:

Code:
  #include <iostream.h>  // Hier werden zusätzliche Befehle eingebunden 
  #include <string> //zum inkludieren der headerdatei
using namespace std;

  void main()
  {


int zahl;
int i = 1;
string ausgabe;

    cout << "Was soll wiederholt werden?" << endl;
    cin >> ausgabe;
    cout << "Wieoft soll wiederholt werden?" << endl; 
    cin >> zahl;

  while (i <= zahl)

    {
    cout << ausgabe << endl;
    i++;
    }


  }

wenn ich mit meinem Compiler jetzt das compilieren will kommt folgende fehlermeldung:

Fatal error: unable to open input file 'string'
--- errorlevel 1

ich hab danach auch schon gegoogelt aber nix gefunden.

hat jemand ne ahnung wo mein fehler liegt?

Ich benutze Digital Mars C/C++ Compilers.
 
#include <string> gilt meines Wissens nach erst ab MSVC 7.0, versuch es mit <string.h>.
 
dann bekomm ich folgende fehlermeldung:

Fatal error: unable to open input file 'string'
--- errorlevel 1

D:\dm\bin>dmc -cpp hello
using namespace std;
^
hello(3) : Error: undefined identifier 'std'
string ausgabe;
^
hello(10) : Error: undefined identifier 'string'
cin >> ausgabe;
^
hello(13) : Error: undefined identifier 'ausgabe'
--- errorlevel 1
 
Hm keine Ahnung wie alt der Digital Mars ist, aber anscheinend ziemlich alt, wenn er <string> nicht kennt. string.h wäre nicht richtig.

Hast du die Möglichkeit auf einen anderen zu wechseln?
 
Mach mal nicht

Code:
#include<iostream.h>

sondern

Code:
#include<iostream>

Dann kompiliert er bei mir ohne Probleme. Das Programm läuft auch einwandfrei. Ich hab den Dev-C++ Compiler.

EDIT:

Code:
#include <iostream>  // Hier werden zusätzliche Befehle eingebunden 
#include <string> //zum inkludieren der headerdatei
using namespace std;

int main()
{

    int         zahl;
    int         i = 1;
    string      ausgabe;

    cout << "Was soll wiederholt werden?" << endl;
    cin >> ausgabe;
    cout << "Wie oft soll wiederholt werden?" << endl; 
    cin >> zahl;

    while (i <= zahl)
    {
        cout << ausgabe << endl;
        i++;
    }
    
    return 0;

}
 
Zuletzt bearbeitet:
ich hab den gestern erst runtergeladen!
habt ihr denn nen link für nen aktuellen?

weil so bekomm ich die fehlermeldung

Fatal error: unable to open input file 'iostream'
--- errorlevel 1

Edit:

folgende version hab ich: Digital Mars Compiler Version 8.42n

Edit2:

ich benutze den befehl dmc -cpp datei

liegt da vielleicht ein fehler?

Edit 3:
hab jetzt auch Dev-C++ Compiler runtergeladen, jetzt funktionierts! aber anstatt void main hab ich int main benutzen müssen, sonst meckert er!
 
Zuletzt bearbeitet:
Die aktuelle Version ist 8.49:

http://www.digitalmars.com/download/freecompiler.html

zu beachten ist der rote Hinweis auf der Seite:
To use <iostream> and other STL code, download STLport 4.5.3 as well

Anscheinend bringt der Digital Mars einen Großteil der Standardbibliothek nicht mit.
STLport sollte aber Make Support für den DMC mitbringen, von daher sollte die Installation hoffentlich nicht allzuschwierig werden.

Ich würde dir allerdings den aktuellen STLport nahelegen, sofern der DMC damit umgehen kann:
http://stlport.sourceforge.net/


Edit:
Ist auch richtig, dass er meckert. void main ist schlichtweg falsch (ist es schon immer gewesen), auch wenn viele "Lehrbücher" und bevorzugt Uni-Profs solchen Schmarrn schreiben.
 
mich würd mal der hintergrund interessieren!
denn der lehrer der mir java gelernt hat, bei dem haben wir auch mit void main programmiert!
 
Der Hintergrund ist ganz einfach.

Der international genormte C++ Standard definiert die main-Funktion (genauso wie der C-Standard) wie folgt:
http://www.kuzbass.ru:8086/docs/isocpp/basic.html#basic.start.main

Ein gültiges C++-Programm hat also die Form
Code:
int main() ...
oder
Code:
int main( int argc, char* argv[]) ...



Hintergrund des Rückgabewerts von main ist, dass das Programm der Umgebung mitteilen kann, ob es erfolgreich abgelaufen ist oder nicht.
Natürlich kann man sich denken "hey, mein Programm ist nun zu Ende, nach mir die Sintflut, mir doch egal was die Umgebung jetzt macht". Vielleicht wurde aus diesem Grund vielen Compilern die Unart mit void main beigebracht. Fakt ist aber, dass void main schon immer falsch war.
 
Zuletzt bearbeitet:
ok danke!
ich hab jetzt allerdings ein weiteres problem!

string var1;
cin >> var1;

wenn ich diese 2 befehle hintereinader ausführe, speichert der in der variable nicht den ganzen satz der eingegeben wurde, sondern nur das erste wort!

an was liegt das?
 
Der Inputstream denkt bei jedem Leerzeichen, dass deni Wort zuende ist. Ich glaube mit cin geht das garnicht, du könntest nach "gets" suchen. Bin zwarnicht sicher ob das ne saubere C++ Lösung ist oder nur doofes Gehacke, bei mir auf der Arbeit benutzen sie's aber ;)
 
getline( cin, string);

liest eine ganze Zeile. Kann problematisch sein, wenn du vorher etwas mit >> gelesen hast, da dann das '\n' nicht aus dem Stream entfernt wird. (der >>-Operator überliest es, getline aber nicht, d.h. man liest immer erstmal eine Leerzeile ein.)
 
ich habe nun folgenden code:
Code:
    cout << "Was soll in Textdatei geschrieben werden?" << endl;
    getline( cin, var1);
    cout << endl;
    cout << "- " << var1 << " - ";
    cout << "Erfolgreich in Textdatei geschrieben...." << endl << endl;

    
    ofstream f;
    f.open("db.txt", ios::app);

    f << var1 << endl;

Ich will jetzt aber bevor ich mein string in die Textdatei abspeichere, bestimmte buchstaben durch andere ersetzen!

also z.B. jedes ö durch oe ersetzen lassen, wie mach ich das?
 
Mit dem ö greifst du jetzt schon so eine Sache auf, die nicht mehr wirklich einfach zu handlen ist, weil das durch die eingestellte Codepage und das verwendete Locale beeinflusst wird.

Aber davon mal abgesehen:
Du machst einfach eine Schleife über den String und schaust Zeichen für Zeichen nach, ob das entsprechende Zeichen dabei ist.
Ich würde an dieser Stelle nicht den Original-String bearbeiten, sondern einen zweiten anlegen.

Ich will dir jetzt mal nicht einfach den Code hinrotzen, denn davon lernst du ja nix :) Aber wenn du Fragen/Probleme hast, kann ich das ja immernoch tun ;)


Noch als Hilfe:
Du kannst entweder mit string.size() und string[x] auf beliebige Zeichen zugreifen. Oder du benutzt die Iterator-Schnittstelle von string
 
naja, eigentlich gehts garnicht um das ö!
Ich wird am schluss jedes zeichen durch ein anderes ersetzt!

Ich hab schon bei google nach replace oder str_replace wies bei PHP ist gesucht, aber nix gefunden!

Ich will auch nicht den ganzen code haben! ich will eigentlich nur wissen wie der befehl dazu heißt und wie er funktioniert...
 
Du kannst replace verwenden:
http://www.sgi.com/tech/stl/replace.html

Allerdings kannst du damit nur ein Zeichen durch ein anderen ersetzen, und nicht eines durch mehrere.

Mit string::replace, kannst du bestimmte Teilstrings durch andere ersetzen:
http://www.sgi.com/tech/stl/basic_string.html

Das was du willst aber direkt zu machen, da wüsste ich nicht, dass die Standardbibliothek bereits eine fertige Lösung liefert. Sprich wie ich oben umrissen habe, eine eigene Funktion mit Schleife schreiben.
 
also ich suche praktisch einen befehl der ungefähr so aussieht:

replace(string, a, d);


also es soll in einer Stringvariable alle buchstaben a durch d ersetzt werden....


Edit:

Wobei natürlich die Gefahr besteht, das er anfängt alle a durch d zu ersetzten! aber alle d sollen auch durch f ersetzt werden.
jetzt kanns sein das dann alle die am anfang a warehen am schluss f sind...
 
Zuletzt bearbeitet:
unsigned int replace(char* string,char a, char b){
char* str = string;
unsigned int ix = 0;
while(*str){
if(*str == a){*str = b; ix++;}
str++;
}
return ix;
}

gibt den counter aus ->>

printf(" count -> %d",replace(string,'a','d'));
 
@arc_user
ic hdenk mal dass ist für nen Anfänger nicht so klar ersichtlich;)
machs doch einfach so:
void replace(char *string, char a, char b, int MaxChars) //MaxChars= maximale menge an Zeichen in string
{
for(int i=0; i<MaxChars; i++)
{
if(string=='\0')
break;
if(string==a)
string=b;
}
}
 
Zurück
Oben