问题遇到的现象和发生背景
想要编写一个服务器,然后保存客户端信息用的是链表,但是当新的用户加进来时,一直遍历不到链表尾节点,每次都是从第一个节点后面开始插入的,也不知道什么问题。
用代码块功能插入代码,请勿粘贴截图
void *login(void *arg)
{
char buf[50];
MESS regist=malloc(sizeof(mess));
MESS p=head;
char buf_name[10];//用户名
char buf_account[10];//账号
char buf_password[10];//密码
int connfd = *(int *)arg;
send(connfd,"1.Login 2.Register",20,0);//给客户端反馈信息,是登录还是注册
recv(connfd,buf,2,0);
printf("buf:%s\n",buf);
if(!strcmp(buf,"1"))//判断登录还是注册
{
send(connfd,"Please enter a user name",30,0);
recv(connfd,buf_name,10,0);
send(connfd,"Please enter a password",30,0);
recv(connfd,buf_password,10,0);
while (1)
{
p=p->next;
//验证用户与密码是否相符
if(((strcmp(p->name,buf_name)==0||strcmp(p->account,buf_name)==0)&&strcmp(p->account,buf_name)==0))
{
send(connfd,"login success",30,0);
printf("login success\n");
send(connfd,"quit",11,0);
break;
}
else
{
send(connfd,"login fail",30,0);
printf("login fail\n");
send(connfd,"quit",11,0);
break;
}
}
}
else if(!strcmp(buf,"2"))//这里是注册
{
send(connfd,"please input your name",30,0);
recv(connfd,buf_name,20,0);
send(connfd,"please input your password",30,0);
recv(connfd,buf_password,20,0);
long acc=rand()%89999+10000;//随机生成账号
sprintf(buf_account,"%ld",acc);//将账号转化为字符串
printf("buf_account:%s\n",buf_account);
sprintf(buf,"%s %s %s",buf_name,buf_account,buf_password);//将新用户信息进行拼接
printf("%s\n",buf);
int ret=fprintf(fd,"%s\n",buf);
if(ret==-1)
{
perror("printf error\n");
}
while (1)
{
p=p->next;//问题就在这里,每次遍历到第一个节点后面就是NULL;第一个节点后面还有数据
if((strcmp(p->name,buf_name)==0||strcmp(p->account,buf_name)==0))
{
send(connfd,"register fail",30,0);
printf("register fail\n");
send(connfd,"quit",11,0);
break;
}
if(p->next == NULL);//然后就在第一个节点后面开始插入数据
{
show_user(head);
printf("p_name:%s\n",p->name);
char input[10];
strcpy(regist->name,buf_name);
strcpy(regist->account,buf_account);
strcpy(regist->password,buf_password);
p->next=regist;
regist->next=NULL;
send(connfd,"register success",30,0);
printf("register success\n");
while (1)
{
scanf("%s",input);
send(connfd,input,11,0);
if((strcmp(input,"quit")==0))
break;
}
break;
}
}
}
pthread_exit(NULL);
}
运行结果及报错内容
我在主函数就遍历了整个链表第一句就是链表里面的信息
最后做插入的时候却只有第一个节点和新插入的节点
我的解答思路和尝试过的方法
我猜测是线程函数传参的问题,我将表头定义为全局变量,在函数中都能将链表很好的输出,一到遍历尾节点插入就不行了;
我想要达到的结果
想找到一个链表插入的标准规范。