我是链接列表的新用户,现在我在节点数量方面遇到的问题很少。
这里我可以填充链表的第一个节点,但gets()
函数似乎暂停执行以填充下一个节点。
输出就像:
Var name : var
Do you want to continue ?y
Var name : Do you want to continue ? // Here I cannot input second data
这是我的代码:
struct data
{
char name[50];
struct data* next;
};
struct data* head=NULL;
struct data* current=NULL;
void CreateConfig()
{
head = malloc(sizeof(struct data));
head->next=NULL;
current = head;
char ch;
while(1)
{
printf("Var name : ");
gets(current->name); //Here is the problem,
printf("Do you want to continue ?");
ch=getchar();
if(ch=='n')
{
current->next=NULL;
break;
}
current->next= malloc(sizeof(struct data));
current=current->next;
}
}
答案 0 :(得分:7)
这是因为:
ch=getchar();
从输入中读取y
或n
并分配给ch
,但在输入缓冲区中有一个换行符,在下一次迭代中由gets
读取。
要解决此问题,您需要在用户输入的y/n
后使用换行符。为此,您可以将另一个电话添加到getchar()
:
ch=getchar(); // read user input
getchar(); // consume newline
此外,应使用函数fgets
代替gets
。 Why?
答案 1 :(得分:2)
这正是@codaddict所说的。你需要清理缓冲区。
void fflushstdin( void )
{
int c;
while( (c = fgetc( stdin )) != EOF && c != '\n' );
}
您可以阅读这些解释得非常好的链接:
答案 2 :(得分:0)
你还应该添加像
这样的行 current->next = 0;
后
current=current->next;
确保最后一个元素的下一个不是悬空。