Return ohne int Variable erkennen ?!


  • 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



  • Ich kann nicht sehen, in welcher Hinsicht das Programm

    #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;
    }
    

    die Anforderungen nicht erfüllt. Musst du mir jetzt erklären, was an dem Programm falsch sein soll.



  • darauf war mein post bezogen.

    out schrieb:

    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.
        }
    }
    

    Nicht zu dem Code von dir, da du ja z.B. .empty() nutzt -> (so eine Lösung haben wir ja schon 😉 ) aber
    So wie ich Sepp verstanden hatte, sollte das ja auch ohne sowas gehen. 🙂 -> ich denke deins wird gehen

    gruß guest054



  • 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;
    			if( current == '\n' )
    				return 0;
            }
    
            last = current; // Du musst last schon immer setzen.
        }
    }
    

Anmelden zum Antworten