上述代码,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;
}
注意,名称可以在现实生活中多一点多才多艺:想想外国人的多字节字符,甚至简单地称为比尔盖茨(Bill Gates)。上面的代码处理后者,但不是这一个:Éléonore de Provence
,亨利三世,英格兰国王,1223年轻的妻子 - 1291
唯一problemI SE在这个代码是语义@chqrlie。如果该人没有中间名,但只输入姓氏和名字,那么姓氏的含义被解释为“中间”。 – user3078414
@ user3078414:我不确定你在评论中的含义。如果用户只输入一个只有2个部分的名字,那么'sscanf()'只能转换'first'和'middle',并且*标准名称*会被打印为'first'和full'middle'的首字母,这真的是最后一个名字。重命名这3个数组'part1','part2'和'part3'将减少潜在的混淆。 – chqrlie
感谢您的回应,@ chqrlie。我正在考虑可能组织数据并准备将其复制到任何数据库所需的代码。我不相信有人需要这样的代码来提供'printf()'。 ( - : – user3078414