2016-07-24 12 views
3

Ich versuche ein Basisprogramm zu entwickeln, das Ihren Namen trägt und die Ausgabe im Standardformat liefert. Das Problem ist, dass ich möchte, dass der Benutzer eine Option hat, den zweiten Vornamen nicht hinzuzufügen.Drucken eines Namens im Standardformat

Zum Beispiel: Carl Mia Austin gibt mir C. M. Austin, aber ich will, dass selbst wenn der Input Carl Austin ist, sollte es mir C. Austin geben, ohne den Benutzer zu fragen, ob sie einen zweiten Vornamen haben oder nicht. Also, gibt es einen Weg oder eine Funktion, die das automatisch erkennen könnte ??

#include <stdio.h> 

int main(void) { 
    char first[32], middle[20], last[20]; 

    printf("Enter full name: "); 
    scanf("%s %s %s", first, middle, last); 
    printf("Standard name: "); 
    printf("%c. %c. %s\n", first[0], middle[0], last); 

    return 0; 
} 

Antwort

7

Wie derzeit geschrieben, scanf("%s %s %s", first, middle, last); erwartet 3 Teile, bis der Benutzer tippt sie warten eingegeben und wird werden.

Sie möchten eine Eingabezeile mit fgets() lesen und dass Teile für Namen Scan mit sscanf und zählen, wie viele Teile umgewandelt wurden:

#include <stdio.h> 

int main(void) { 
    char first[32], middle[32], last[32]; 
    char line[32]; 

    printf("Enter full name: "); 
    fflush(stdout); // make sure prompt is output 
    if (fgets(line, sizeof line, stdin)) { 
     // split the line into parts. 
     // all buffers have the same length, no need to protect the `%s` formats 
     *first = *middle = *last = '\0'; 
     switch (sscanf(line, "%s %s %[^\n]", first, middle, last)) { 
     case EOF: // empty line, unlikely but possible if stdin contains '\0' 
     case 0: // no name was input 
      printf("No name\n"); 
      break; 
     case 1: // name has a single part, like Superman 
      printf("Standard name: %s\n", first); 
      strcpy(last, first); 
      *first = '\0'; 
      break; 
     case 2: // name has 2 parts 
      printf("Standard name: %c. %s\n", first[0], middle); 
      strcpy(last, middle); 
      *middle = '\0'; 
      break; 
     case 3: // name has 3 or more parts 
      printf("Standard name: %c. %c. %s\n", first[0], middle[0], last); 
      break; 
     } 
    } 
    return 0; 
} 

Beachten Sie, dass Namen ein bisschen vielseitiger im wirklichen Leben sein kann: Denken Sie an ausländische Namen mit Multibyte-Zeichen, oder einfach nur William Henry Gates III, auch bekannt als Bill Gates. Der obige Code behandelt das letztere, aber nicht diese: Éléonore de Provence, die junge Frau von Heinrich III, König von England, 1223 - 1291.

+0

Die einzige problemI se in diesem Code ist semantische @chqrlie. Für den Fall, dass die Person keinen zweiten Vornamen hat, sondern nur den Vor- und Nachnamen eingibt, wird der Nachname als "Mitte" interpretiert. – user3078414

+0

@ user3078414: Ich bin mir nicht sicher, was Sie in Ihrem Kommentar meinen. Wenn der Benutzer einen Namen mit nur 2 Teilen eingibt, werden nur 'first' und' middle' durch 'sscanf()' konvertiert und der * Standardname * wird als Initial des 'first' und des vollen' middle' gedruckt. Das ist wirklich der Nachname. Das Umbenennen dieser 3 Felder "part1", "part2" und "part3" würde potentielle Verwirrung reduzieren. – chqrlie

+0

Danke für Ihre Reaktion, @chqrlie. Ich denke an den Code, der möglicherweise Daten organisiert und sie in die benötigte Datenbank kopieren kann. Ich glaube nicht, dass jemand einen solchen Code nur zum Einspeisen von 'printf()' benötigt. (-: – user3078414

0

Sie isspace nutzen könnten und suchen nach Leerzeichen im Namen:

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

int main(void) 
{ 
    char first[32], middle[32], last[32]; 
    int count=0; 
    int i = 0; 
    printf("Enter full name: "); 
    scanf(" %[^\n]s",first); 
    for (i = 0; first[i] != '\0'; i++) { 
     if (isspace(first[i])) 
      count++; 
    } 
    if (count == 1) { 
     int read = 0; 
     int k=0; 
     for (int j = 0; j < i; j++) { 
      if (isspace(first[j])) 
       read++; 
      if (read > 0) { 
       last[k]=first[j]; 
       k++; 
      } 
     } 
     last[k+1] = '\0'; 
    } 
    printf("Standard name: "); 
    printf("%c. %s\n", first[0], last); 

    return 0; 
} 

-Test

Enter full name: Carl Austin 
Standard name: C. Austin 
+0

Ich nehme an, du solltest auch testen, was mit zwei Vornamen passiert. – usr2564301

+0

Es gibt ein streunendes "s" in deinem 'scanf'-Muster. Aber vielleicht wäre es besser,' fgets' stattdessen zu verwenden. – anatolyg