You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下TCP Socket实现登录注册系统时客户端无法输入用户名问题

根因分析

你的问题是标准输入缓冲区残留换行符导致用户名读取逻辑提前终止:
客户端执行scanf("%d", &choice)读取用户选择的数字时,只会读取输入的数字内容,用户输入完成后按下的\n换行符会残留在标准输入缓冲区中。后续调用func()读取用户名时,while ((username[n++] = getchar()) != '\n')循环第一次调用getchar()就会直接读取到这个残留的换行符,直接跳出循环,表现为跳过用户名输入步骤。

修复步骤

1. 清理scanf残留的换行符

在客户端scanf("%d", &choice)语句后新增代码,清空输入缓冲区残留的换行符:

scanf("%d", &choice);
// 新增:清理输入缓冲区残留内容
while (getchar() != '\n');
write(sockfd, &choice, sizeof(int));

2. 删除服务端无效代码

服务端func()函数中存在一段无意义的本地输入读取逻辑,会导致服务端异常阻塞,直接删除这段代码即可:

// 删除以下两行无效代码
// while ((username[n++] = getchar()) != '\n')
// ;
// write(newsockfd, username, sizeof(username));

3. 修正客户端笔误

客户端func()函数最后一行的清空操作存在参数错误,修正为正确的清空对象:

// 原错误代码:bzero(username, sizeof(password));
// 修正为
bzero(password, sizeof(password));

内容的提问来源于stack exchange,提问作者Jonathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 18:27:03