我尝试制作登录功能,但是我被卡住了......
我有两个应用程序(服务器和客户端)。我从客户端向服务器发送由read(0,username,100)
创建的用户名。
在服务器中,如果我想通过阅读检查客户端中引入的用户名(例如:test
)等于"test"
与strcmp(username,"test") == 0
,则它不相等,我不会#39;不知道为什么。
你能帮帮我吗?
感谢。
答案 0 :(得分:0)
有很多可能的原因,但幸运的是,不是很多,
你可以传递用户名而不传递'\0'
nul
终止符,在这种情况下(可能无论如何只是为了确定),你可以这样做
char username[100];
ssize_t length;
if ((length = read(0, username, sizeof(username) - 1)) == -1)
pleaseAbortSubsequentOperationsOn_username();
username[length] = '\0';
将确保username
nul
终止。当然,在另一端发送的数据中可能会嵌入'\0'
以及许多其他细微之处,但如果它只是从另一端发送的纯文本,这可能会有所帮助。
另请注意另一个限制是对于超过99
个字符的字符串,使用此方法会以静默方式将其截断。
我的意思是这不够,但它可能会帮助你朝着正确的方向前进。
有可能有一个'\n'
或其他控制字符(see this comment),并且它被strcmp()
进行比较,导致错误的比较。所以你也可以检查一下,或者写一个忽略空格的比较函数,或者从读取字符串中删除前导/尾随空格。
正如您可以看出这些问题可能会有不同的组合,因此使用printf()
进行检查可以帮助您了解问题所在。
对于'\0'
终结器问题,您需要一个内存调试器,如valgrind,或者等效于您的环境。但是上面第一点提出的简单修复就足以进行测试了。