2017-11-03 3 views
0

Ich möchte ein einfaches C-Programm erstellen, damit Benutzer ihren Namen eingeben und ihren Namen ausdrucken können (z. B. John Mike). Aber ich möchte auch, dass das Programm es dem Benutzer verbietet, einen Namen mit einem Zahlenwert innerhalb des Namens einzugeben (z. B. John34 Mike).Wie kann der Benutzer Alphabete mit Leerzeichen für den Namen eingeben (z. B. John Mike), aber dem Benutzer nicht erlauben, Alphabete mit Ziffern einzugeben?

Ich weiß, wie man scanf("%[^\n]",&name); verwendet, aber mit diesem Benutzer kann versehentlich Ziffern in Eingabe Name eingeben. Ich möchte nicht Benutzer Alphabete mit Ziffern Wert eingeben. Gibt es eine Möglichkeit, dies zu lösen?

+0

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

+0

Vielen Dank für den Hinweis –

Antwort

0

Holen Sie sich die Eingabe mit getline Funktion. Und dann überprüfen Sie die Zeichenfolge mit isdigit Funktion, um die Eingabezeichenfolge zu erlauben oder zu verbieten.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int main(int argc, char *argv[]) 
     { 
      FILE *stream; 
      char *line = NULL; 
      size_t len = 80; 
      ssize_t nread; 



      nread = getline(&line, &len, stdin); 
      printf("Retrieved line %s", line); 
     for(int i=0;line[i]!='\0';i++) 
     if(isdigit(line[i])){ 
      printf("Disallow\n"); 
       return 0;} 
     printf("Allow\n"); 
     return 0;  

     } 
+0

Können Sie mir bitte ein Beispiel zeigen? –

+0

danke für den c-programm code –

1

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.

+0

Schön, danke für die information –

Verwandte Themen