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