、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
このコードでのみproblemI SEがセマンティック@chqrlieあります。人がミドルネームを持たず、ファーストネームとラストネームだけを入力した場合、ラストネームは「ミドル」と解釈されます。 – user3078414
@ user3078414:あなたのコメントで何を意味するのか分かりません。ユーザーが2つの部分のみで名前を入力すると、 'first 'と' middle'のみが 'sscanf()'によって変換され、*標準名*が 'first'と'それは本当に最後の名前です。これらの3つの配列 'part1'、' part2'と 'part3'の名前を変更すると、潜在的な混乱を減らすことができます。 – chqrlie
お返事ありがとうございます、@chqrlie。私はおそらくデータを整理し、必要なデータベースにコピーできるようにコードを考えています。私は誰かが 'printf()'を与えるためにこのようなコードを必要とするとは思わない。 ( - : – user3078414