Mehrere Wörter in einer Variable

sim4000

sim4000

Lebende Foren Legende
Nabend.

Hab mal wieder ein Problem, was warschienlich wieder keine goßes is...
Meine Frage:

Wie kann ich in eine C++ Variable ganze sätze speichen?
Code:
Zb. Hallo. Wie geht es dir?

Ich habs schon mit vielen verschiedenen Typen versucht.
Ich bekomm es nicht hin. Sobald der Text ein Leerzeichen endhält macht mein Programm was es will. Is nur ein einfaches Konsolen-Programm.

Mfg, sim4000.
 
Ich weiß nicht wo das Problem ist, bei mir geht das z.B. problemlos.
Code:
#include <string>
#include <iostream>
using namespace std;

int main()
{
	string satz = "Hallo. Wie geht es dir?";
	cout << satz << endl;
	return 0;
}
Vielleicht liegt der Fehler in der Eingabe des Satzes, ich weiß ja nicht was dein Programm machen soll ;)
 
Das programm soll via cin den Satz aufnehmen und ihn via cout << variable an einer anderen stelle wieder ausgeben. Ungefair so:
Code:
string name;
cout << "geben sie ihren namen ein." << endl;
cin >> name;
cout << endl << "hallo" << name << "."

Nur sobalt der Name mehr als ein Wort hat klappts nich mehr.

Mfg, sim4000.
 
Mit fgets ist das kein Problem darstellen.
Das Problem dabei ist, das fgets das \n(newline)-Zeichen mit einliest.
D.h. du musst es selbststaendig entfernen.

Die Funktionsweise von fgets kannst du hier nachlesen ;)
 
Damit kann man doch auf Dateien zugreifen. Wie kann mir das mit dem variablen-Problem weiterhelfen?
Ich versteh das nich ganz...
 
Falsch, du kannst auch Strings einlesen.
Beispiel:
fgets(deinstring, stringlaenge, stdin);
 
Ich glaube ich warte bis mittwoch.
Da hab ich in der schule wieder c++.
Ich checks nicht.

Ich bekomm vom compiler immer errors

Code:
fgets(text, 100, stdin);

Mfg, sim4000.
 
Ich glaube ich warte bis mittwoch.
Da hab ich in der schule wieder c++.
Ich checks nicht.

Ich bekomm vom compiler immer errors

Code:
fgets(text, 100, stdin);

Mfg, sim4000.

Du musst die Variable voher auch schon mit einer bestimmten Groesse deklarieren ;)
Ich geh nun schlafen.
Wenn du genauere Fragen hast dann melde dich bei mir: 307926545.

Gute Nacht ;)
 
Es kann ja sein, dass ich mich gewaltig irre, aber in meinem Hinterkopf spuckt da noch eine Verbindung von Pointern beim Einsatz von Strings rum.
Ein String ist ja nichts weiter als ein array mehrerer Zellen vom Typ char. Daher musste doch ein String als ein Zeiger auf das erste Feld von char definiert werden, oder?
Ala:

char* name["length"];

oder sowas in der Art. Ich weiß es gerade nicht genau, kann es aber auch nicht testen, da mein compiler aus irgendwelchen Gründen gerade nicht will (verdammte *********).
Dann könnte er doch auch wie gewohnt mit cin/cout arbeiten. Werde morgen früh dazu nochmal genauere Gedanken fassen.

(Falls ich hier Blödsinn schreib verzeiht mir, bin gerade leicht alkoholisiert von der Wiedervereinigungsparty zurück)
 
Zuletzt bearbeitet:
dass zuerst speicher da sein muss fuer einen array damit man was einlesen kann ist klar. daher wuerde ich ihn nicht so anlegen
char *arr[length];
sondern so:
char arr[length];

dann hast damit sicher kein prob!

mfg hazelnoot
 
Leute, macht es doch nicht so kompliziert....

Für sowas gibt es getline()..

Code:
int main() {
cout << "Satz eingeben: ";
String Eingabe;
getline(cin, Eingabe);
cout << Eingabe;

}
 
Soviel ich weis ist, wenn man cin verwendit die Ausgabe von folgender Eigabe:
Eingabe: Hallo Welt\n
Ausgabe: Hallo
Da soviel ich weis cin bis zum nächsten Leerzeichen einen String einliest. Und Whitespaces davor auch abschneidet. So kannst du es meiner Meinung nach nur Zeichenweise einlesen.
-------------------------------
#include <iostream>
using namespace std;
char puffer[1];
char ausgabe[100];

int main(){

int i=0;

while ((puffer[0]=cin.get()) != '\n'){
ausgabe=puffer[0];

if (i<=100)
i++;
else
break;

}
ausgabe='\0';

cout << "\n" << ausgabe <<"\n";

}
--------------------------------------------
Somit kannst du auch z.B. tabs, ... entwerten.
 
@root192

Du hast meinen Post nicht gelesen oder?

Warum machst du etwas was so einfach ist (siehe meinen Post) so kompliziert?

Und dazu noch fehleranfällig ohne Ende.
 
Wenn ich das so mache wie supersucker, dann überspringt er die Variable "text".
Ich Poste am Besten mal den Source. Is ja nich viel.

Code:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <string>
#include <iostream>
#include <cstdlib>
#include <stdio.h>

using namespace std;


//***************************************************************************************
string start ("* Bannercreator 1.0 - Erstelle ein Banner mit deiner Nachricht. *");    //
                                                                                       //
void mitteilung_sternchen(void) {                                                      //
  int groesse_mitteilung = start.size();                                               //	*****************************************************************
  for(int i=groesse_mitteilung; i!=0; i--) { cout << "*"; }                           //	*                                                               *
}                                                                                      //	* Bannercreator 1.0 - Erstelle ein Banner mit deiner Nachricht. *
                                                                                       //	*                                                               *
void mt_leerzeile(void) {                                                              //	*****************************************************************
  int groesse_mitteilung = start.size();                                               //
  cout << "*";                                                                         //
  for(int i=groesse_mitteilung-2; i!=0; i--) { cout << " "; }                         //
  cout << "*";                                                                         //
}                                                                                      //
//***************************************************************************************

string uzeichen;
string text;
char antwort;


void rahmen(void) {
  int groesse = text.size();
  for(int i=groesse+4; i!=0; i--) { cout << uzeichen; }
}

void leerzeile(void) {
  int groesse = text.size();
  for(int i=groesse+2; i!=0; i--) { cout << " "; }
}

void nachricht(void) {
  cout << uzeichen << " " << text << " " << uzeichen;
}


int main(int argc, char *argv[]) {

  mitteilung_sternchen(); cout << endl;				//
  mt_leerzeile(); cout << endl;					//
  cout << start << endl;					//  Begrüssungsmeldung
  mt_leerzeile(); cout << endl;					//
  mitteilung_sternchen(); cout << endl << endl << endl;		//

  cout << "Um ein Banner zu erstellen, bitte Umrandungszeichen und Text angeben." << endl << endl;

  cout << "Bitte Umrandungszeichen eingeben (*, #, ...)" <<  endl;
  cin >> uzeichen;
  cout << endl << "Bitte Text eingeben" << endl;
  [B]getline(cin, text);[/B] [B]//Variable text ist der Satz[/B]
  cout << endl << endl << "Umrandungszeichen: " << uzeichen << endl;
  cout << "Text: " << text << endl << endl;
  cout << "Sind diese Angaben richtig? (j/n)" << endl;
  cin >> antwort;
  cout << endl;

while(antwort != 'j');

  rahmen(); cout << endl;
  cout << uzeichen; leerzeile(); cout << uzeichen << endl;
  nachricht(); cout << endl;
  cout << uzeichen; leerzeile(); cout << uzeichen << endl;
  rahmen(); cout << endl << endl;

  cout << "Dieses Banner kannst du einfach in ein Textdokument kopieren." << endl << "Viel Spass damit." << endl << endl << endl;
  return EXIT_SUCCESS;
}

@supersucker
Bloß wenn ich dein SCript sp wie dus gepostet hast aufführe geht es.
 
Zuletzt bearbeitet:
ich nehm auch immer fgets her!!! uner c glaub ich nimmt das eh jeder her oder?

mfg hazelnoot
 
Ich wuesste nicht was an ,,fgets()'' so schwer sein soll.

Ich auch nicht.

Aber man muss die "max number of bytes to be read" angeben, da ist getline() vor allem für Anfänger weniger fehlerträchtig.
 
Eben, wenn dann gleich richtig lernen, wobei ich es eh Quatsch finde
(in C++) das man eine Variable mit string initialisieren kann.
Ein guter Programmierer initialisiert lieber ein Char-Array.
Es ist schlecht nicht zu wissen wie viel man in die Variable schreiben kann,
da kann es leicht zu ,,Undefinied Behaivor''(in einen Bereich geschrieben, der nicht alloziiert wurde) kommen.

@hazelnoot:
Bedingt, genaues Einlesen mache ich oft ueber fgetc(das manchmal sogar faulheitskonformer ist.. ^^).
 
Ja tut mit ja leid das ich doof bin.
Was kann ich denn dafür das wir in der Schule mit string arbeiten?
Kann doch nichts anderes machen wie meine "Chefs" sagen.
Jedenfalls hat mein "Chef" ne lösung gehabt.
Und zwar kann man skipwhitespaces ausschalten.
Code:
cin.unsetf(ios_base::skipws);
cin >> text;
cin.setf(ios_base::skipws);
Für den einen cin werden "lerrzeichen-überspringen" ausgeschaltet, dann aber wieder eingeschaltet.

Aber wenn ich das mache kommt ne endlosschleife. Die abfrage wiederholt sich endlos.

Mfg, sim4000.
 
@Xerda soviel ich weis, habe ich in meinem Beispiel einen char array[] benutzt. Das einlesen, ist vll etwas umständlich, hat aber bei mir funktioniert. Ich finde das Zeichenweise einlesen ist fast das Beste, denn man kann gleich bestimmte Zeichen rausfiltern, die Länge beachten, ... .
 

Ähnliche Themen

Last mit etc/passwd anzeigen lassen

mehrere variablen aus datei lesen

NULL-Pointer funktioniert nicht

Server's Power

Partitionsproblem nach Linux-Installation

Zurück
Oben