微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐