gets_s funktioniert nicht



  • Hallo,

    ich habe ein Problem mit der Funktion gets_s und zwar möchte ich von der Konsole in ein Char-Array einlesen und zwar so:

    char buf[512];
    	memset( &buf, '\0', 512 );
    
    	rc = recv( s,
    		       buf,
    			   512,
    			   0 );
    	printf( "\nserver response: %s\n", buf );
    
    	while( rc != SOCKET_ERROR )
    	{
    		printf("\nSOCKET > COMMAND > ");
    
    		memset( &buf, '\0', 512 );
    		gets_s( buf, 512 );
    		//cin.get( buf, 512 );
    
    		buf[strlen(buf)] = '\r';
    		buf[strlen(buf)] = '\n';
    
    		send( s,
    			  buf,
    			  strlen(buf),
    			  0 );
    
    		memset( &buf, '\0', 512 );
    
    		rc = recv( s,
    			       buf,
    				   512,
    				   0 );
    
    		if( rc==0 )
    		{
    			printf( "server disconnected\n" );
    			break;
    		}
    		else if( rc == SOCKET_ERROR )
    		{
    			printf( "receiving error  (code: %d)\n", WSAGetLastError() );
    			break;
    		}
    
    		printf( "\nserver response: %s\n", buf );
    	}
    

    Angenomment ich sende "USER ftp", steht in buf aber nur " ftp" (inkl. dem Leerzeichen).
    Benutze ich anstatt gets_s cin.get( buf, 512 ), habe ich den selben Effekt. Woran liegt das?



  • Das hier

    char buf[512]; 
    memset( &buf, '\0', 512 );
    

    kannst du auch abkürzen:

    char buf[512]={0};
    

    EDIT:
    -----

    Das hier

    buf[strlen(buf)] = '\r'; 
    		buf[strlen(buf)] = '\n';
    

    macht auch wenig Sinn, oder? Du musst dich schon entscheiden, was an die Stelle soll! Ich denke, hier überschreibst du auch die abschließende Null, aber egal...

    Abgesehen davon: die Eingabe an sich klappt. Wenn ich deinen Code teilweise ausführe (ohne den recv-Kram), dann ist nach meiner Eingabe "ftp rgne" auch genau dieser String in buf.



  • Ja, schon klar. Aber das ist ja wohl kaum der Fehler 😉



  • _matze schrieb:

    Das hier

    buf[strlen(buf)] = '\r'; 
    		buf[strlen(buf)] = '\n';
    

    macht auch wenig Sinn, oder? Du musst dich schon entscheiden, was an die Stelle soll!

    Abgesehen davon: die Eingabe an sich klappt. Wenn ich deinen Code teilweise ausführe (ohne den recv-Kram), dann ist nach meiner Eingabe "ftp rgne" auch genau dieser String in buf.

    Doch, das macht sehr wohl Sinn, denn nachdem '\r' angefügt wurde liefert strlen(buf) ja einen um 1 erhöhten Wert zurück. Das ist also schon richtig.

    EDIT:
    Bei mir steht egal was ich eingebe immer der erste Teil nicht drin.

    EDIT2:
    Wenn ich auch nur das Code-Schnipsel ausführe, dann steht bei mir auch das richtige drin ...



  • FrEEzE2046 schrieb:

    Doch, das macht sehr wohl Sinn, denn nachdem '\r' angefügt wurde liefert strlen(buf) ja einen um 1 erhöhten Wert zurück. Das ist also schon richtig.

    Hehe, auch wieder wahr... 🤡



  • _matze schrieb:

    FrEEzE2046 schrieb:

    Doch, das macht sehr wohl Sinn, denn nachdem '\r' angefügt wurde liefert strlen(buf) ja einen um 1 erhöhten Wert zurück. Das ist also schon richtig.

    Hehe, auch wieder wahr... 🤡

    Es muss irgendeinen Seiteneffekt geben. Ich weiß nur nicht welchen^^. Vor allem da er bei gets_s( buf, 512 ) beim ersten Durchgang der Schleife immer einfach durchgeht ohne auf Eingabe zu warten ...



  • FrEEzE2046 schrieb:

    Doch, das macht sehr wohl Sinn, denn nachdem '\r' angefügt wurde liefert strlen(buf) ja einen um 1 erhöhten Wert zurück. Das ist also schon richtig.

    Die Gefahr besteht, das die abschließende 0 überschrieben wird.



  • dang0r schrieb:

    FrEEzE2046 schrieb:

    Doch, das macht sehr wohl Sinn, denn nachdem '\r' angefügt wurde liefert strlen(buf) ja einen um 1 erhöhten Wert zurück. Das ist also schon richtig.

    Die Gefahr besteht, das die abschließende 0 überschrieben wird.

    Wohl kaum, da ich das ganze Array mit '\0' gefüllt habe.



  • FrEEzE2046 schrieb:

    Es muss irgendeinen Seiteneffekt geben. Ich weiß nur nicht welchen^^. Vor allem da er bei gets_s( buf, 512 ) beim ersten Durchgang der Schleife immer einfach durchgeht ohne auf Eingabe zu warten ...

    Vermutlich solltest du vorher mal den Eingabepuffer leeren!



  • FrEEzE2046 schrieb:

    dang0r schrieb:

    FrEEzE2046 schrieb:

    Doch, das macht sehr wohl Sinn, denn nachdem '\r' angefügt wurde liefert strlen(buf) ja einen um 1 erhöhten Wert zurück. Das ist also schon richtig.

    Die Gefahr besteht, das die abschließende 0 überschrieben wird.

    Wohl kaum, da ich das ganze Array mit '\0' gefüllt habe.

    Werden 511 Zeichen eingelesen, sprengt dir die nächste Zeile dein Array.
    gets_s( buf, 512 );
    //cin.get( buf, 512 );
    buf[strlen(buf)] = '\r';



  • _matze schrieb:

    FrEEzE2046 schrieb:

    Es muss irgendeinen Seiteneffekt geben. Ich weiß nur nicht welchen^^. Vor allem da er bei gets_s( buf, 512 ) beim ersten Durchgang der Schleife immer einfach durchgeht ohne auf Eingabe zu warten ...

    Vermutlich solltest du vorher mal den Eingabepuffer leeren!

    Und wie? Zumindest

    cin.clear();
    cin.ignore(MAX_INT);
    

    führt dazu, dass er immer vorbei läuft^^.



  • cin? Du weißt schon, in welchem Forum du hier bist, oder? 😉



  • _matze schrieb:

    cin? Du weißt schon, in welchem Forum du hier bist, oder? 😉

    Ja, Ja. Im Endeffekt ist es mir gleich ob ich eine C oder C++ Lösung habe. Da es mit gets_s nicht so hinhauen möchte, bin ich auch zu cin bereit^^.

    Zu mal

    fflush(stdin);
    

    auch nichts bringt


Anmelden zum Antworten