Return ohne int Variable erkennen ?!



  • Erst einmal Hallo an alle,
    ich habe ein kleines Problem mit dem erkennen von der RETURN-Taste.
    Ich habe ein kleines Programm, dass eine Eingabe erwartet:
    Egal was eingegeben wird soll dann wieder als Ausgabe auf der Konsole erscheinen, einzige Ausnahme -> es wird nur die Return-Taste gedrückt, dann soll "Hello World!" ausgegeben werden. Habe schon einiges gelesen wie: cin.get() == a etc. aber das geht nicht so wie ich es mir vorstelle ...

    #include <iostream>
    #include <cstring>
    using namespace std;

    int main() {
    
    	char a[100];
    	cout << "Bitte gib da mal was ein !" << endl;
    	cin >> a;
    
    	if ("ABFRAGE") { // Hier sollte eine abfrage wie a == Eingabe-Taste sein
    		cout << "Hello World!" << endl;
    		return 0;
    	}
    	else {
    		cout << a << endl;
    	}
    	return 0;
    }
    

    hoffe ihr könnt mir da weiter helfen - wenn ihr Zeit und Lust habt würde ich mich natürlich über eine ausführliche Erklärung freuen

    gruß guest0054



  • Am besten mit std::getline und std::string

    #include <string>
    #include <iostream>
    
    int main()
    {
        std::string input;
        std::getline(std::cin, input);
    
        if(input.empty())
        {
            cout << "Hello World!" << endl;
            return 0;
        }
        else
        {
            cout << input << endl;
        }
    
        return 0;
    }
    


  • Super danke das geht, genau so habe ich mir das vorgestellt 😃

    der Vollständigkeit halber sei noch kurz auf eine Änderung hinzuweisen ^^
    für alle die Anfänger sind, lässt sich der Ethon nicht compilen -> entwerder:

    #include <string>
    #include <iostream>
    
    int main() {
        std::string input;
        std::getline(std::cin, input);
    
        if(input.empty()) {
            std::cout << "Hello World!" << std::endl;
            return 0;
        }
        else {
            std::cout << input << std::endl;
        }
    
        return 0;
    }
    

    oder

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main() {
        string input;
        getline(std::cin, input);
    
        if(input.empty()) {
            cout << "Hello World!" << endl;
            return 0;
        }
        else {
            cout << input << endl;
        }
    
        return 0;
    }
    

    Danke Ethon - mein Retter 😉

    gruß guest0054


  • Mod

    Das geht ohne Bloat, wenn wir uns überlegen, was die Bedingung "es wird nur die Return-Taste gedrückt" in Streamsprache übersetzt bedeutet*: Es folgen zwei '\n' aufeinander. Somit hat man eine einfachere Lösung (zwar vom Code her nicht schöner, aber das was passiert ist einfacher):

    #include<iostream>
    
    int main()
    {
        char current, last=0;
        while(std::cin.get(current))
        {
            if (last == '\n' and current == '\n')
            {
                std::cout << "Hello world!\n";
                return 0;
            }
            last = current;
        }
    }
    

    *: Denn C++ weiß nichts von Tasten oder überhaupt, woher die Eingaben kommen. Die Aussage ist daher nämlich eigentlich sinnlos.



  • Also auch dir Danke,

    aaaber... 😉 bei deiner Variante muss man 2x Return drücken.
    Die nächste Frage die sich stellt ist ist dieses Programm auch auf Windows lauffähig?
    Meines Wissens
    UNIX-Return == \n
    Windows-Return == \n\r
    oder irre ich mich da ?

    gruß guest0054


  • Mod

    guest0054 schrieb:

    Also auch dir Danke,

    aaaber... 😉 bei deiner Variante muss man 2x Return drücken.

    Ach, dann initialisier last mit '\n'. Ich war nicht sicher, ob es beim ersten Mal schon zählen soll.

    Die nächste Frage die sich stellt ist ist dieses Programm auch auf Windows lauffähig?
    Meines Wissens
    UNIX-Return == \n
    Windows-Return == \n\r
    oder irre ich mich da ?

    Jain. Das ist zwar so (ist Windows nicht \r\n? Schlag es selber nach, wenn es dir wichtig ist), aber das merkst du gar nicht mehr. In C++ ist ein Zeilenumbruch '\n', egal welches System. Dies ist der Hauptunterschied (mWn sogar der einzige Unterschied) zwischen Dateistreams im "normalen" Modus und Streams die mit ios::binary geöffnet wurden. Bei binary bekommst du tatsächlich alle Zeichen, ohne binary wird aus diesen Sequenzen einfach \n gemacht.



  • habs mal versucht wie du meintest und last mit '\n' initialisiert:

    #include <iostream>
    
    int main() {
        char current, last='\n';
    
        while(std::cin.get(current)) {
            if (last == '\n' and current == '\n') {
                std::cout << "Hello world!\n";
                return 0;
            }
    
            last = current;
        }
    }
    

    Output( bei Eingabe asd) :
    Hello world!

    und bei einer Eingabe != Return muss man immer noch 2x Return drücken
    also so scheint es auch nicht zu gehen oder habe ich dich falsch verstanden ? 😃


  • Mod

    guest054 schrieb:

    Output( bei Eingabe asd) :
    Hello world!

    und bei einer Eingabe != Return muss man immer noch 2x Return drücken
    also so scheint es auch nicht zu gehen oder habe ich dich falsch verstanden ? 😃

    Kann ich nicht nachvollziehen. Hast du auch wirklich den gezeigten Code genommen und auch erneut übersetzt?



  • Ja habe ich - grade nochmal geprüft
    für die Return-Taste geht es jetzt auch wie gewünscht.
    Nur bei einer "normalen" Eingabe muss man 2x Return drücken und dann gibt
    es noch zusätzlich die falsche Ausgabe.
    Bin grad dran zu schaun woran das genau liegt ^^



  • Grade gemerkt der Code hat vorher schon nicht richtig funktioniert, sorry mein Fehler ... 😞

    gab auch schon mit last=0;

    die Ausgabe -> Hello world!

    ...

    ups grade noch aufgefallen ( einfach zu wenig geschlafen die letzte Nacht):

    #include <iostream>

    int main() {
        char current, last=0; /* current ist nur ein Zeichen - keine Zeichenkette bzw String - gilt also nur für einen Charakter*/
    
        while(std::cin.get(current)) {
    		last = current;
            if (last == '\n' and current == '\n') {
                std::cout << "Hello world!\n";
                return 0;
            }
            else {
    			std::cout << current << std::endl;
    			return 0;
    		}
        }
    }
    

    so läuft es aber nur für ein Zeichen was man eingibt:
    Sprich Eingabe: asd
    Ausgabe: a

    also ich glaube für "Strings" ist die erste Antwort am besten ^^

    gruß guest054


  • Mod

    guest054 schrieb:

    Nur bei einer "normalen" Eingabe muss man 2x Return drücken und dann gibt
    es noch zusätzlich die falsche Ausgabe.

    Moment, damit wir uns auch richtig verstehen: Das gezeigte Programm macht folgendes (Beispieleingabe fett, Kommentar von mir kursiv):

    [b]asd[/b]         [i]Eingabe nicht leer, nix passiert[/i]
    [b]ejufn[/b]       [i]Eingabe nicht leer, nix passiert[/i]
    [b]wenjkwe[/b]     [i]Eingabe nicht leer, nix passiert[/i]
                [i]Eingabe leer, mache Ausgabe[/i]
    Hallo Welt  [i]Programmende[/i]
    

    Ist dies nicht das, was du wolltest? Falls nein, was stattdessen?



  • guest0054 schrieb:

    Egal was eingegeben wird soll dann wieder als Ausgabe auf der Konsole erscheinen, einzige Ausnahme -> es wird nur die Return-Taste gedrückt, dann soll "Hello World!" ausgegeben werden.

    Sprich
    Eingabe: asd
    Ausgabe: asd

    Eingabe: Return-Taste
    Ausgabe: Hello world!

    Hihi haben wir ein bisschen aneinander vorbei geschrieben 😉

    gruß



  • ich muss bei seppj's code auch 2 mal enter drücken bevor hello world kommt wenn vorher nix eingegeben wurde!



  • Versuch den, hab den bissel geändert, der sollte nun gehen, aber halt nur für einen Charakter 😃

    #include <iostream>
    
    int main() {
        char current, last=0;
    
        while(std::cin.get(current)) {
    		last = current;
            if (last == '\n' and current == '\n') {
                std::cout << "Hello world!\n";
                return 0;
            }
            else {
    			std::cout << current << std::endl;
    			return 0;
    		}
    
            //last = current;
        }
    }
    

    gruß


  • Mod

    Ahh, die andere Eingabe soll wiederholt werden! Tschuldigung, das habe ich überlesen. Dann so:

    #include <iostream>
    
    int main() 
    {
        char current, last='\n';
    
        while(std::cin.get(current)) 
        {
            if (last == '\n' and current == '\n') 
            {
                std::cout << "Hello world!\n";
                return 0;
            }
            std::cout << current;
            last = current;
        }
    }
    

    http://ideone.com/XefcQM

    P.S.: Weißt du überhaupt, was std::endl macht? Wenn du sagst "Zeilenumbruch", dann ist die Antwort nicht vollständig. Mach also '\n', wenn du nur Zeilenumbruch meinst.

    P.P.S.: Nach dem Hello World soll doch immer noch das Programm abgebrochen werden, oder? Das hatte ich aus deinem allerersten Code so übernommen. Falls nicht, überlasse ich dir das zur Übung.



  • Hehe ja ich weiss was std::endl bewirkt 🙂

    und ich bin mir auch nicht sicher, ob man das so löst, wie du das gemacht hast und das Programmverhalten ist immer noch nicht das erwünschte - was nicht so schlimm ist ^^ 😃

    Also nochmal um das Verhalten zu klären 😉 :
    z.B.
    Eingabe: asdf -> dann Retrun-Taste drücken ^^ (dadurch sofortige Ausgabe)
    Ausgabe: asdf

    oder

    Eingabe: Return-Taste
    Ausgabe: Hello World!

    so ist das gedacht

    daher bringt es nichts char zu setzten und den Eingabe-Buffer "weiter ausgeben" zulassen

    #include <iostream>
    
    int main()
    {
        char current, last='\n';
    
        while(std::cin.get(current))
        {
            if (last == '\n' and current == '\n')
            {
                std::cout << "Hello world!\n";
                return 0;
            }
            else {
    			std::cout << current << "\n";
    			last = current;
    		}
    		return 0;
        }
    }
    

    Bei diesem Code passiert das:

    Eingabe: asdf -> dann Retrun-Taste drücken ^^ (dadurch sofortige Ausgabe)
    Ausgabe: a

    Also so wie du das machst wird das glaub ich nichts ^^ es sei denn man macht es noch bisschen komplizierter - aber wolltest du ja grade nicht.
    Falls dir doch noch ein weg einfällt sag ruhig bescheid. Ich schau auch noch neben bei ob ich noch einen Weg finde es dennoch nach deinem Ansatz umzusetzen.

    Achja noch eine Frage neben bei - ist das wirklich ein guter Still char
    als Typ zu setzten und dann den Ausgabe-Buffer einfach weiter ausgeben zu lassen ?
    Dass das geht ist mir klar 😃

    SeppJ schrieb:

    Somit hat man eine einfachere Lösung (zwar vom Code her nicht schöner, aber das was passiert ist einfacher):

    #include<iostream>
     
    int main()
    {
        char current, last=0;
        while(std::cin.get(current))
        {
            if (last == '\n' and current == '\n')
            {
                std::cout << "Hello world!\n";
                return 0;
            }
            last = current;
        }
    }
    


  • #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        char current, last='\n';
    
    	string eingabe;
    	getline( cin, eingabe );
    
    	if( eingabe.empty() )
    	{
    		std::cout << "Hello world!\n";
    	}
    	else
    	{
    		std::cout << eingabe << "\n";
    	}
    
    	return 0;
    }
    


  • Achja noch eine Frage neben bei - ist das wirklich ein guter Still char
    als Typ zu setzten und dann den Ausgabe-Buffer einfach weiter ausgeben zu lassen ?
    Dass das geht ist mir klar 😃

    Naja was hat das mit Stil zu tun. In char paast eben genau ein Buchstabe. Wenn du nur ein Buchstabe eingeben willst, nimmst du char. Wenn du öters einen Buchstaben eingeben willst, dann nimmst du eben char und eine Schleife. Willst du nur 1x etwas eingeben, nimmst du keine Schleife. Willst du eine Zeichenkette eingeben, nimmst du std::string .

    Achja, Zeile 7 oben kannst du natürlich löschen. 😃



  • Im Übrigen geht SeppJs Lösung auch perfekt. Er realisiert eine Zeichenkette, indem er öfters hintereinander nur 1 Buchstabe eingibt. Dabei musst du eben nur darauf achten, dass du das im Puffer liegende Enter nach einer Eingabe absorbierst.

    #include <iostream>
    
    int main()
    {
        char current, last='\n';
    
        while( std::cin.get(current) )
    	{
            if (last == '\n' && current == '\n')
    		{
                std::cout << "Hello world!\n";
                return 0;
            }
    		else
    		{
    			std::cout << current;
    		}
    
            last = current; // Du musst last schon immer setzen.
        }
    }
    


  • Hihi das verstehe ich - drücke mich wohl wirklich etwas doof aus ^^ 😉 sorry

    Also nochmal um das Verhalten zu klären 😉 :
    z.B.
    Eingabe: asdf -> dann Retrun-Taste drücken ^^ (dadurch sofortige Ausgabe)
    Ausgabe: asdf
    Programmende!!!!

    oder

    Eingabe: Return-Taste
    Ausgabe: Hello World!
    Programmende!!!!

    so ist das gedacht

    und es soll natürlich nicht nur ein Zeichen ausgegeben werden bzw. man weiss nicht was der Benutzer eingibt 😉

    gruß guest054


Log in to reply