Alles mit cin einlesen, auch leerzeichen und das dahinter



  • hallo,
    mich würd mal interessieren, wie ich in einer variable

    char text[20]
    

    ALLES einlesen kann, was ich auch eingebe, also auch die leerzeichen und was nach diesen steht.

    wenn ich den code folgendermaßen habe gets nicht, da wird immer nur das erste wort genommen:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	char text[20];
    
    	cout<<"Text eingeben: ";
    	cin>>text;
    	cout<<text<<"\n";
    
    	return 0;
    }
    

    der code ist nur zum ausprobieren, dass das programm keinen sinn ergibt weiß ich 😃

    denke mal, dass es da eine ganz einfache möglichkeit gibt, bin nur leider totaler anfänger und bin deshalb noch sehr unbeholfen...

    thx so far, Mr. Pink



  • vielleicht statt cin>>text lieber getline(text,cin)
    http://www.cppreference.com/cppio/getline.html



  • hmm, habe fstream eingebunden, aber ich bekomme immer folgenden fehler:

    error C2065: 'getline' : nichtdeklarierter Bezeichner
    

    alles was ich versucht habe lies sich nicht kompilieren, auf der page konnte ich leider auch nicht allzuviel finden, gibt vllt noch eine andere möglichkeit, oder könnte mir das jemand nochmal idiotensicher angeben?
    wär echt cool, Mr. Pink



  • kannst du nochmal das geänderte prog posten?
    benutzt du ggf. nen c++ string?



  • hierbei kommt der oben gezeigte fehler:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    	char text[20];
    
    	cout<<"Text eingeben: ";
    	getline(text,cin);
    	cout<<text<<"\n";
    
    	return 0;
    }
    

    hierbei komt ein anderer fehler 😞 :

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    	char text[20];
    
    	cout<<"Text eingeben: ";
    	istream& getline(text,cin);
    	cout<<text<<"\n";
    
    	return 0;
    }
    
    error C2061: Syntaxfehler : Bezeichner 'text'
    

    mann, ist wahrscheinlich son totaler anfägerfehler, aber würd mich über hilfe freuen, thx



  • Normalerweise arbeitet man mit std::string und std::getline:

    std::string input;
    std::getline(std::cin, input);
    


  • Streams haben eine Methode getline() für char-Arrays (die benötigt als zusätzlichen Parameter den verfügbaren Platz), die globale Funktion ist für den Einsatz mit strings:

    //Variante 1:
    char data[21];
    cin.getline(data,21);
    
    //variante 2:
    string data;
    getline(cin,data);
    


  • ah, alles klar, funktioniert gut, hab dazu aber noch eine frage:
    wenn ich

    cin.getline(data,5);
    

    eingebe, dann bekomme ich die ersten 4 zeichen, logisch würden mir 6 vorkommen,. wenn bei 0 angefangen wird zu zählen, oder eben 5, wieso ist das so?



  • Der zweite Parameter von getline() ist der Speicherplatz, den du in "data" zur Verfügung hast - und weil es dort auch noch das Stringende-Zeichen '\0' unterbringen muß, holt getline() ein Zeichen weniger als dort angegeben wird.



  • Hallo,

    das darfst du nicht mit dem Index des Arrays durcheinanderbringen. Die 5 sagt einfach aus: Lies 5 Zeichen ein (\0 gehört auch dazu 😉 ).

    edit: wieder mal zu lahm...

    MfG

    GPC



  • ah, ok, hatte das in der tat mit nem array verglichen.
    aber wieso kommt da überhaupt ein '/0' hin und sind das nicht 2 zeichen?



  • Nein, da kommt kein "/0" sondern ein '\0' rein und das ist wirklich ein Zeichen 😉

    Hintergrund: Der \ ist ein Escape-Zeichen, es sagt dem Compiler dass das folgende Zeichen eine besondere Bedeutung hat. Hier die Ziffer 0 mit der Bedeutung "binär 0". '\0' ist also ein Zeichen mit der Wertigkeit 0. In C benutzt man dieses Null-Zeichen dazu um C-Strings abzuschliessen. Da in einem char-Array ja keine Länge abgelegt werden kann, merkt man sich so, wie lang der String ist.



  • Schau dir mal die ASCII Zeichentabelle an.

    \ dient zur 'Maskierung'.

    Somit ist es, wie die Schlüsselwörter, ein zur Sprache gehörendes Zeichen.

    Möchte ich es benutzen um es anzuzeigen so muss dieses selber auch maskiert werden, damit es nicht als Escape Sequenz betrachtet wird.

    cout << "\\"; // Man nennt es Escape-Zeichen für Escape Sequenzen
    
    //Beispiel für Escape Sequenzen
    cout << "\n"; // neue Zeile
    cout << "\t"; // Tabulator
    cout << "\b"; // Backspace
    cout << "\0"; // Nullbyte, wird verwendet u.a. um Strings abzuschliessen.
    // Wird auch Zeilenendekennung genannt, damit weiß man wo der String zu Ende ist
    

    Kleine Erklärung dazu.

    http://de.wikipedia.org/wiki/Escapen



  • ah, cool, danke, is jetzt klar denk ich... 👍



  • if(menue == 2)
    			{
    			cout << "OK guy! Let's go, which abbrevation do you want to define?" << endl;
    			cin  >> search;
    
    			cout << "And what means '" << search << "' ?"<< endl;
    			cin.getline (abb,1000);
    			writer = fopen("c://abbs.txt", "a");
    			fprintf(writer,"%s %s \n", search, abb);
    			fclose(writer);
    			thx = 1;
    			cout << "Definition saved! Thanks a lot!\n" << endl;
    			cout <<"[1] Look for an abbrevation!"<< endl;			
    			cout <<"[2] Define one more abbrevation!"<< endl;		
    			cout <<"[3] Show complete abb-list!"<< endl;	
    			cout <<"[4] Exit Abbiator!"<< endl;
    			cin  >> menue;												      
    			}
    

    bei mir wird hier cin.getline einfach übersprungen also es kommt direkt "definitiion saved..."

    warum?
    hier meine bibs:
    #include <stdio.h>
    #include <iostream.h>
    #include <string.h>

    habs auch mal ohne leerzeichen zw. cin.getline und (abb,1000); versucht, funzt auch nicht.
    der compiler gibt keine fehler aus..



  • mal ins blaue geraten...

    cin  >> search;
    

    schreib da mal nen

    cin.sync();
    

    drunter ... gruesse



  • nach dem cin>>search; steht noch das Enter im Tastaturpuffer - das mußt du per cin.ignore() noch auf den Kompost werfen, bevor du weitermachst.

    (btw solltest du eher fstreams verwenden als FILE*'s)



  • ne hat auch nicht funktioniert,
    wolltest du mich mit absicht in eine endlosschleife locken?



  • Wo produziert ignore() eine Endlosschleife?



  • war mal wieder zuspät
    das bezog sich auf TDO
    aber danke auf jedenfall es funzt

    (ok jetzt muss ich das prog nur noch online stellen und in einem jahr für 50000 an google oder yahoo verkaufen)

    TDO schrieb:

    mal ins blaue geraten...

    cin  >> search;
    

    schreib da mal nen

    cin.sync();
    

    drunter ... gruesse


Anmelden zum Antworten