我想从用户收集数据,我想用fgets()
完成任务。避免`fgets()`double输入匹配
在我main.c
文件:
do
{
user = ask_user_info();
// ... Code exporting data to file ...
free(user);
fprintf(stdout, "Do you want to add another user?\nChoice: ");
scanf("%c[^\n]", &choice);
} while (choice == 'y');
下面是我写的,把工作完成的功能:
UserData *ask_user_info()
{
char firstname[STRLEN];
char lastname[STRLEN];
char username[STRLEN];
char password[STRLEN];
char email[STRLEN];
fprintf(stdout, "First Name: ");
get_user_input(firstname);
flush_stdin();
fprintf(stdout, "Last Name: ");
get_user_input(lastname);
flush_stdin();
fprintf(stdout, "Username: ");
get_user_input(username);
flush_stdin();
fprintf(stdout, "Password: ");
get_user_input(password);
flush_stdin();
fprintf(stdout, "Email: ");
get_user_input(email);
flush_stdin();
return fill_fields(firstname, lastname, username, password, email);
}
void get_user_input(char *input)
{
int length;
char *buffer = (char *) malloc (STRLEN * sizeof(char));
(*buffer) = '\0';
if (fgets(buffer, STRLEN, stdin) != NULL)
{
length = strlen(buffer)-1;
buffer[length] = '\0';
strncpy(input, buffer, length+1);
}
free(buffer);
}
UserData *fill_fields(const char firstname[], const char lastname[],
const char username[], const char password[], const char email[])
{
UserData *user = (UserData *) malloc (sizeof(UserData));
user->firstname = (char *) malloc (strlen(firstname) * sizeof(char));
strncpy(user->firstname, firstname, strlen(firstname));
user->lastname = (char *) malloc (strlen(lastname) * sizeof(char));
strncpy(user->lastname, lastname, strlen(lastname));
user->username = (char *) malloc (strlen(username) * sizeof(char));
strncpy(user->username, username, strlen(username));
user->password = (char *) malloc (strlen(password) * sizeof(char));
strncpy(user->password, password, strlen(password));
user->email = (char *) malloc (strlen(email) * sizeof(char));
strncpy(user->email, email, strlen(email));
return user;
}
void flush_stdin()
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
一切编译,一切似乎正常工作,但该方案要求时对于用户输入(大部分时间),它要求用户点击输入两次以移动到下一个输入。
一方面我知道这种行为是由flush_stdin()
函数引起的。另一方面,我无法摆脱flush_stdin()
函数,因为它确保没有输入字段被跳过。如果我做的程序会输出类似于First Name: Last Name:
如何避免双击并确保收集所有输入?
我认为所有'malloc()'调用都是不必要的。简单地读入缓冲区,将它们的长度和它们的指针一起传递。 – trojanfoe