我正在尝试开发一个基本程序,它以您的名字命名并以标准格式提供输出。问题是我希望用户可以选择不添加中间名。
例如:Carl Mia Austin给了我C. M. Austin但是我想要即使输入是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;
}
答案 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
,也称为比尔盖茨。上面的代码处理后者,但不是这一个:Éléonore de Provence
,亨利三世的年轻妻子,英国国王,1223 - 1291.
答案 1 :(得分: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