Problem mit gets() und größe der deklarierten Zeichenkette
-
Hallo miteinander,
folgendes Problem: Ich will, dass der eingegebene Name maximal 4 Zeichen lang ist (siehe deklarierte Zeichenkette). Nun kann ich aber mit dem unten beschriebenen Programm mehr als 4 Zeichenketten eingeben.
Es sollte ca so aussehen
Name eingeben: Mustermann
Name: MustDie (ungewollte) Ausgabe ist aber
Name eingeben: Mustermann
Name: MustermannWo liegt der Fehler, was mache ich falsch??
main() { char str[5]; printf("Name eingeben:"); gets(str); printf("Name: %s", &str); }
Vielen Dank!
-
kurisuchan schrieb:
Wo liegt der Fehler, was mache ich falsch??
Du benutzt
gets
Da das auch eine Sicherheitslücke ist, gilt
gets
auch als deprecatedDu kannst
fgets
nehmen, aber das speichert auch (wenn Platz ist) das '\n' von der Entertaste mit ab.fgets(str,5,stdin);
Oder scanf mit Ausnutzung der Möglichkeiten der Formatspecifier:
scanf("%4s", str);
Beachte die Unterschiedlichen Angaben für die maximale Anzahl Zeichen (einmal 5 und einmal 4)
-
DirkB schrieb:
Du kannst
fgets
nehmen, aber das speichert auch (wenn Platz ist) das '\n' von der Entertaste mit ab.fgets(str,5,stdin);
Es darf auch etws mehr sein ...
int c; char str[5]; fgets(str,5,stdin); str[4] = (char)0; while (((c = getchar()) != EOF) && (c != '\n'));
Der Code räumt den Rest bis zum Zeilenende noch weg.
-
Also, dann doch eher:
char *p; int c; char str[5]; fgets(str,5,stdin); // Rückgabewert sollte selbstverständlich auch überprüft werden if ((p = strchr(str, '\n')) != NULL) *p = '\0'; // weg mit '\n' wie bei gets() else while (((c = getchar()) != EOF) && (c != '\n'));
-
Die Zuweisung der 0 an die letzte Stelle ist unnötig (macht
fgets
schon)
Und wenn weniger als 4 Zeichen eingegeben werden wartet der Code unötig auf ein'n'
-
Ups, da war EinGast schneller
-
DirkB schrieb:
Die Zuweisung der 0 an die letzte Stelle ist unnötig (macht
fgets
schon)
Und wenn weniger als 4 Zeichen eingegeben werden wartet der Code unötig auf ein'n'
Die 0 sicherzustellen ist (möglicherweise) etwas paranoid ..
Wo wird unnötig gewartet ? Auf Stringende muss immer geprüft werden. Ob man sicherstellt, das vor der
nächsten Eingabe der Puffer leer ist kommt auf die Anwendung an.Zeilenendezeichen löschen ist eine gute Idee.
EinGast
-
merano schrieb:
Wo wird unnötig gewartet ?
In deiner
while
-Schleife nach demfgets
DirkB schrieb:
.. wenn weniger als 4 Zeichen eingegeben werden
Denn dann steht das '\n' schon in str
merano schrieb:
Auf Stringende muss immer geprüft werden.
Dann doch aber auch in der schon erfolgten Eingabe. So wie EinGast es vorgemacht hat.