read()和harcodded(C语言)创建的字符之间的差异

时间:2015-11-27 15:15:39

标签: c

我尝试制作登录功能,但是我被卡住了......

我有两个应用程序(服务器和客户端)。我从客户端向服务器发送由read(0,username,100)创建的用户名。

在服务器中,如果我想通过阅读检查客户端中引入的用户名(例如:test)等于"test"strcmp(username,"test") == 0,则它不相等,我不会#39;不知道为什么。

你能帮帮我吗?

感谢。

1 个答案:

答案 0 :(得分:0)

有很多可能的原因,但幸运的是,不是很多,

  1. 你可以传递用户名而不传递'\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个字符的字符串,使用此方法会以静默方式将其截断。

    我的意思是这不够,但它可能会帮助你朝着正确的方向前进。

  2. 有可能有一个'\n'或其他控制字符(see this comment),并且它被strcmp()进行比较,导致错误的比较。所以你也可以检查一下,或者写一个忽略空格的比较函数,或者从读取字符串中删除前导/尾随空格。

  3. 正如您可以看出这些问题可能会有不同的组合,因此使用printf()进行检查可以帮助您了解问题所在。

    对于'\0'终结器问题,您需要一个内存调试器,如valgrind,或者等效于您的环境。但是上面第一点提出的简单修复就足以进行测试了。