Wie für Namen Benutzer zur Eingabe von Buchstaben mit Raum ermöglichen (zum Beispiel John Mike), aber mit Ziffern Wert Benutzer zur Eingabe von Buchstaben nicht zulassen?
Lesen in der gesamten Linie der Eingabe in eine Zeichenfolge verarbeiten und dann den String.
Beurteilen Sie die Zeichenfolge für zulässige Zeichen und Muster.
Wichtig, großzügig zu sein, was gültig ist, und verschiedene Kulturprobleme in Betracht ziehen. Die Überprüfung der Namensgültigkeit ist ein heikles Thema. Einfach zu bekommen negative feed versucht, es zu diskutieren. Kann auch als not constructive betrachtet werden.
Verwenden Sie isalpha()
für die Überprüfung der ersten Ebene und dann nach anderen gültigen Zeichen, die mindestens eine Alpha versichern.
isalpha()
ist locale empfindlich und bietet einige Ebene der Internationalisierung.
#include <ctype.h>
#include <stdbool.h>
bool name_test1(const char *s) {
const char *between_char = "-'"; // Allow O'Doul, Flo-Jo. Adjust as needed
bool valid = false;
while (*s) {
if (isalpha((unsigned char) *s)) {
valid = true;
} else if (*s == ' ' && valid) { // or isspace((unsigned char) *s) for any white-space
valid = false; // valid char must follow
} else if (strchr(between_char, *s) != NULL && valid) {
valid = false; // valid char must follow
} else {
return false;
}
s++;
}
return valid;
}
Die && valid
in *s == ' ' && valid
einen führenden Raum versichert ist nicht gültig.
Beispiel:
void ntest(const char *s) {
printf("%d <%s>\n", name_test1(s), s);
}
int main(void) {
ntest("John Mike");
ntest("John34 Mike");
ntest("John Mike ");
ntest(" John Mike");
ntest("Flo-Jo");
ntest("O'Doul");
char name[100];
while (fgets(name, sizeof name, stdin)) {
name[strcspn(name, "\n")] = '\0'; // lop off potential trailing \n
if (name_test1(name)) puts("Acceptable name");
else puts("Unacceptable name");
}
}
1 <John Mike>
0 <John34 Mike>
0 <John Mike >
0 < John Mike>
1 <Flo-Jo>
1 <O'Doul>
...
Am besten nicht Verwendung scanf("%[^\n]",&name);
es Probleme: Es liest fast eine Linie, die '\n'
nicht lesen. Eine Zeile von nur "\n"
ist ein Problem. Es hat keinen Schutz gegen das Überlaufen des Puffers.
In Standard C gibt es keine Möglichkeit, die Eingabe key-for-key zu filtern. Wenn Sie dies also tun möchten, müssen Sie plattformspezifischen Code verwenden (möglicherweise in einer Bibliothek eingeschlossen). Sie können nach der Eingabe prüfen, aber nicht die Eingabe der Ziffern stoppen. – unwind
Vielen Dank für den Hinweis –