Return ohne int Variable erkennen ?!


  • 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