加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 以标准格式打印名称

发布时间:2020-12-16 10:03:33 所属栏目:百科 来源:网络整理
导读:我正在尝试开发一个基本程序,它以您的名字命名并以标准格式提供输出.问题是我希望用户可以选择不添加中间名. 例如:Carl Mia Austin给了我C. M. Austin但是我想要即使输入是Carl Austin它也应该给C. Austin而不询问用户他们是否有中间名. 那么,有没有一种方
我正在尝试开发一个基本程序,它以您的名字命名并以标准格式提供输出.问题是我希望用户可以选择不添加中间名.

例如: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. %sn",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 = '';
        switch (sscanf(line,"%s %s %[^n]",last)) {
        case EOF: // empty line,unlikely but possible if stdin contains ''
        case 0:  // no name was input
            printf("No namen");
            break;
        case 1:  // name has a single part,like Superman
            printf("Standard name: %sn",first);
            strcpy(last,first);
            *first = '';
            break;
        case 2:  // name has 2 parts
            printf("Standard name: %c. %sn",middle);
            strcpy(last,middle);
            *middle = '';
            break;
        case 3:  // name has 3 or more parts
            printf("Standard name: %c. %c. %sn",last);
            break;
        }
    }
    return 0;
}

请注意,在现实生活中,名字可能会更加通用:想想多字节字符的外国名字,或者甚至简单的威廉亨利盖茨三世,也被称为比尔盖茨.上面的代码处理后者,但不是这一个:éléonoredeProvence,亨利三世的年轻妻子,英格兰国王,1223 – 1291.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读