从C中的名字和姓氏生成用户名

时间:2017-04-07 22:30:54

标签: c

我正在编写一个C程序来从给定文件(users)生成用户ID。该文件具有每个用户的每一行的名字和姓氏(例如,#34; John Smith"," Steve Mathews"等等)。以下while循环从users读取每一行,并以全小写形式在控制台中打印。在这种情况下,single_line保留小写的名称。

while(!feof(fp)) {
        fgets(single_line, 80, fp);
        for(int i = 0; single_line[i]; i++){
          single_line[i] = tolower(single_line[i]);
        }
        char f_letter = single_line[0];
        char r_letters[20];
}

现在,我想为每个single_line创建一个用户名,其中包含名字的第一个字母和剩余的姓氏字母。到目前为止,f_letter包含名字的第一个字母,如何让r_letters保留姓氏的剩余字母?

3 个答案:

答案 0 :(得分:1)

您可以使用strtok使用分隔符从字符串中提取标记。

例如,对于使用fgets从文件读取的文本行(假设每行只包含两个单词,就像您的情况一样),您可以将第一个和第二个单词提取为:

char *first_name = strtok(single_line, " ");
char *last_name = strtok(NULL, "\n");

换行符字符用作第二个分隔符,因为fgets在读取一行时会保留它,因此可用于在换行符之前提取最后一个标记。

考虑以下用于创建用户名的功能:

#include <stdio.h>
#include <string.h>

void create_usernames(char *filename) {
    char line[80], username[80];
    char *last;
    FILE *fp = fopen(filename, "r");
    // fgets returns a NULL pointer upon EOF or error
    while (fgets(line, 80, fp) != NULL) {
        last = strtok(line, " ");
        last = strtok(NULL, "\n");
        printf("%c%s\n", line[0], last);
    }
    fclose(fp);
}

例如,文件file.txt包含名称:

John Smith
John Diggle
Bruce Wayne
Steve Mathews
你会得到:

create_usernames("file.txt");
JSmith
JDiggle
BWayne
SMathews

答案 1 :(得分:1)

char first_name[81];
char last_name[81];
char user_name[82];
while(!feof(fp)) {
        if(fscanf(fp, "%80s %80s", first_name,last_name) == 2){

            for(i = 0; i < strlen(first_name); i++){
              first_name[i] = tolower(first_name[i]);
            }
            for(i = 0; i < strlen(last_name); i++){
              last_name[i] = tolower(last_name[i]);
            }

            sprintf(user_name, "%c%s", first_name[0], last_name);
        }
}

答案 2 :(得分:0)

找到名字和姓氏之间的空格索引,比如说j。姓氏的第一个字母的索引是j+1