以标准格式

时间:2016-07-24 21:42:12

标签: c string

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

例如: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;
}

2 个答案:

答案 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