c – 以标准格式打印名称

我正在尝试开发一个基本程序,它以您的名字命名并以标准格式提供输出.问题是我希望用户可以选择不添加中间名.

例如: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.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...