所以我正在尝试编写一个程序,让我使用双向链表数据结构读取MP3文件数据的用户输入。我得到了大部分方法和功能,但是当我提示用户输入输入时,它会在用户输入第一行之前打印出两行。例如,
int main()
{
int user_input = 0;
while(!(user_input >= 4))
{
struct MP3_data_node* MP3_data;
MP3_data = (struct MP3_data_node*)malloc(sizeof(struct MP3_data_node));
printf("\nPlease select a number for one of the following instructions:\n");
printf("0: add to list\n1: delete from list\n2: print the list from beginning to end\n3: print the list from end to beginning\n4: exit\n");
scanf("%d", &user_input);
if(user_input == 0)
{
printf("Please provide the artist:");
fgets(MP3_data->artist,50,stdin);
printf("Please provide the album:");
fgets(MP3_data->artist,50,stdin);
printf("Please provide the song title:");
fgets(MP3_data->artist,50,stdin);
printf("Please provide the year the song was released: ");
scanf("%d", &MP3_data->yearReleased);
printf("Please provide the length of the song in seconds: ");
scanf("%d", &MP3_data->runTime);
addToList(MP3_data);
}
...
所以它打印出“请提供艺术家:请提供相册:”然后让我输入,所以我的问题是如何制作它以便打印: 请提供艺术家:(用户输入) 请提供相册:(用户输入) 等
答案 0 :(得分:1)
你在前几个提示中做了正确的事(fgets
),然后切换到scanf
,这是问题的根源。使用fgets
(和strtol
)代替scanf
,你会没事的。 (并且,导致问题中描述的问题的第一个scanf
。)
问题是scanf
仅读取您输入内容的数字部分。这意味着如果您键入 1 2 输入,则scanf
会读取1
和2
但是将Enter
留在输入缓冲区中,以便下次调用fgets
或scanf
。另一方面,fgets
会读取您键入的所有内容,包括Enter
,从而避免此问题。