【发布时间】:2015-05-17 10:43:09
【问题描述】:
我正在尝试从用户那里收集数据,我想使用 fgets() 完成任务。
在我的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);
}
一切都编译好了,一切似乎都正常工作,但是当程序要求用户输入时,(大多数时候)它需要用户按两次 Enter 才能继续下一个输入。
一方面我知道这种行为是由flush_stdin() 函数引起的。另一方面,我无法摆脱flush_stdin() 函数,因为它确保不会跳过任何输入字段。如果我这样做,程序会输出类似First Name: Last Name:
如何避免双重打击并确保收集所有输入?
【问题讨论】:
-
我认为所有那些
malloc()电话都是不必要的。只需读入缓冲区,将它们的长度连同它们的指针一起传递。