我正在编写一个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
保留姓氏的剩余字母?
答案 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
。