C - Begrenzen Sie die Länge der Zeichenfolge
(Sorry für mein schlechtes Englisch !)
Schrieb ich ein Programm, das Sie auffordert, geben Sie ein Kennwort nicht mehr als eine bestimmte Zahl, acht Zeichen in diesem Fall. Die Zeichen, dass die Grenze, werden ausgeschnitten aus dem array:
#include <stdio.h>
#define MAXCHAR 8
main()
{
char password[MAXCHAR];
int i;
char c;
printf("Insert password: MAX 8 CHARS!\n\n");
for(i = 0; i <= MAXCHAR; i++){
c = getchar();
if(i == MAXCHAR){
break;
}
else{
password[i] = c;
}
}
printf("%s\n", password);
}
Damit das Programm funktioniert, ABER es ist ein "seltsames" problem. Wenn die Grenze IST ACHT, und ich geben Sie ein Kennwort mit mehr als acht Zeichen
(Beispiel: P455w0rds98)
die Ausgabe wird wie folgt Aussehen:
P455w0rd☺
So legt ein smiley am Ende und ich weiß nicht, warum. Es passiert nur, wenn a der Grenzwert ist auf acht.
- Leichte Korrektur (keine straftat): meinst Du ", fragt Sie auf Typ ein Passwort" ("digit" hat eine andere Bedeutung und ist ziemlich irritierend hier).
- Lesen Sie mehr über getchar.
- Olaf, wenn Sie erwarten, dass eine präzise Terminologie angezeigt werden, auf diesem forum, Sie sind sich für die Einstellung Enttäuschung. Ich habe selten sehen auch die "Experten" verwenden Sie korrekte Terminologie konsistent, nachdenklich.
- Warum würden Sie so etwas sagen ? "...computer-Programmierung möglicherweise nicht für Sie." Verdammt, Sie zerstört mich, ich war nur ein rookie, wenn einer dies geschrieben. Was Sie sagte, ist nicht gerade ermutigend an alle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die Länge zu drucken oder die Zeichenkette beenden. Andernfalls werden Sie aufrufen Undefiniertes Verhalten. Versuchen Sie dieses, in dem die letztere Methode ist implementiert.
Einige Leute sagen, dass die
if(i == MAXCHAR){ break; }
Teil nicht gut Aussehen, so ist hier ein anderes code-Beispiel:for(i = 0; i <= MAXCHAR; i++)
..sind Sie sicher? ist es nicht, wie die 9 Elemente? Sie können loszuwerden, die ganzebreak;
Dingens....if-break
Sache ist Unsinn.getchar()
in einem. 2) Durch Zufall wenn man sich auf Undefiniertes Verhalten.if-break
Sache ist Unsinn.?Alle C-style-strings haben ein terminal
\0
Zeichen (Wert 0). Dies ist eindeutig von einem anderen Charakter einen Wert, so kann es verwendet werden, um zu signalisieren, das Ende der Zeichenfolge. Das smiley-Gesicht Sie beobachten, ist nur ein Teil eines benachbarten Speicherblocks, der zufällig ein null-Zeichen nach dem ersten byte (damit es nur ein zusätzliches Zeichen). Dieprintf
Funktion liest bytes aus der Zeichenkette gegeben, bis er sieht die\0
. Um Ihr problem zu lösen, können Sie entweder schreiben(Sie müssen reservieren, ein zusätzliches byte im array, für die
\0
).Oder Sie können die zero-out-array aus der get-go:
Oder mit
memset
:Abgesehen von der Antwort, die Sie bereits erhalten von MikeCAT ein alternativer Ansatz wäre die Verwendung von
fgets()
zu Lesen die Eingabe des Benutzers.In diesem Fall , brauchen Sie nicht zu halten die Anzahl der einzelnen Zeichen eingegeben haben, können Sie geben Sie die max Größe und bekommen mit ihm getan. So etwas wie
können den job zu erledigen für Sie, minus die Schleife und Zuordnung für jedes element.
Einer Sache zu erinnern, ist jedoch für kürzere Eingaben als die gegebene Länge,
fgets()
liest und speichert die trailing newline auch, Sie benötigen, um loszuwerden, das manuell. Lesen Sie den verlinkten man-Seite für weitere Ideen.Sagte,
main()
ist ein sehr bad und fast nicht-standard - für gehostete Umgebungen. Sollten Sie verwendenint main(void)
zumindest zu den standards.fgets
derMAXCHAR
Zeichen tatsächlich liestMAXCHAR - 1
Zeichen und verwendet die Letzte für das string-Ende. Es wird auch aufhören zu Lesen, nachdem dieMAXCHAR-1
TEN Zeichen gesehen wurde, unabhängig davon, ob es ein Zeilenumbruch ist oder nicht. Also mitfgets
Sie vielleicht in das problem der Annahme von maximal 6 chars+newline oder 7 chars (mit einem Zeilenumbruch, die noch im stream), das macht es noch schwieriger, Sie zu schlagen, die genaue maximale Anzahl der Zeichen.MAXCHAR
muss angepasst werden, es ist nicht ein fester Wert. 2) Sie haben zu prüfen, und entfernen Sie die nachgestellte newline, falls vorhanden, dann überprüfen Sie die Länge der Zeichenfolge, worum geht es? 3)with a newline still remaining in the stream
das ist eigentlich nicht viel zur Sache hier, ist es nicht?fgets
wird nicht warten, für die Bestätigung des Passworts durch den Benutzer sobald er geliefert hat, die die maximale Menge von Zeichen - Das ist zumindest irritierend, kann aber dazu führen, dass alle möglichen Fehler. Funktioniert, aber ich würde nie verwenden, die in der Produktion von code.