我正在尝试开发一个基本程序,它以您的名字命名并以标准格式提供输出.问题是我希望用户可以选择不添加中间名.
例如: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; }
解决方法
正如目前所写,scanf(“%s%s%s”,第一,中,最后);期望输入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]",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",middle); strcpy(last,middle); *middle = '\0'; break; case 3: // name has 3 or more parts printf("Standard name: %c. %c. %s\n",last); break; } } return 0; }
请注意,在现实生活中,名字可能会更加通用:想想多字节字符的外国名字,或者甚至简单的威廉亨利盖茨三世,也被称为比尔盖茨.上面的代码处理后者,但不是这一个:ÉléonoredeProvence,亨利三世的年轻妻子,英格兰国王,1223 – 1291.