2016-07-24 2 views
3

私はあなたの名前をとり、標準形式の出力を提供する基本的なプログラムを開発しようとしています。問題は、ユーザーにミドルネームを追加しないオプションが必要なことです。標準形式の名前を印刷する

例:Carl M. Austinは私にC. M. Austinを与えますが、InputがCarl Austinであっても、ユーザーにミドルネームがあるかどうかを尋ねることなくC Austinを教えてください。 それで、それを自動的に検出する方法や機能がありますか?同様に、現在書かれ

#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; 
} 

答えて

7

scanf("%s %s %s", first, middle, last);は3つの部分が入力されると、ユーザーの種類、それらまで待つことを期待します。

あなたはfgets()と入力行を読んで、名前の部分のためにそれをスキャンしsscanfとし、変換されたどのように多くの部品カウントする:名前が実際の生活の中で少しより汎用性の高いことができ

#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; 
} 

注:外国人の名前をマルチバイト文字で考えるか、単純にWilliam Henry Gates III(Bill Gatesとも呼ばれます)と考えることもできます。上記のコードは、後者を処理ではなく、この1:Éléonore de Provence、ヘンリーIII、イングランドの王、1223年の若い妻 - 1291

+0

このコードでのみproblemI SEがセマンティック@chqrlieあります。人がミドルネームを持たず、ファーストネームとラストネームだけを入力した場合、ラストネームは「ミドル」と解釈されます。 – user3078414

+0

@ user3078414:あなたのコメントで何を意味するのか分かりません。ユーザーが2つの部分のみで名前を入力すると、 'first 'と' middle'のみが 'sscanf()'によって変換され、*標準名*が 'first'と'それは本当に最後の名前です。これらの3つの配列 'part1'、' part2'と 'part3'の名前を変更すると、潜在的な混乱を減らすことができます。 – chqrlie

+0

お返事ありがとうございます、@chqrlie。私はおそらくデータを整理し、必要なデータベースにコピーできるようにコードを考えています。私は誰かが 'printf()'を与えるためにこのようなコードを必要とするとは思わない。 ( - : – user3078414

0

あなたはisspaceを使用して、名前にスペースのために見ることができる:

#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; 
} 

テスト

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

2つのファーストネームで何が起こるかをテストすることをお勧めします。 – usr2564301

+0

あなたの 'scanf'パターンには" s "がありますが、とにかく' fgets'を使うほうがいいかもしれません。 – anatolyg

関連する問題