通过函数传递时奇怪的指针行为

时间:2017-10-17 15:12:36

标签: c sockets

我几乎肯定会做一些非常愚蠢的事情,但我已经在这方面工作了一段时间,我无法在任何地方找到解决方案。

基本上我正在制作服务器和客户端,客户端需要向服务器发送用户名和密码。如果我把所有东西都放在main函数中,但是当我尝试将它分隔成单独的函数时,似乎做了一些奇怪的事情,所以我认为我没有正确处理指针。如果我打印测试并且在receiveStringData函数中没有完全从客户端获取字符串,那就是当我尝试在authenticate函数中访问指针时。如果我在authenticate函数中执行以下代码...

char *username = receiveStringData(socket_id);
char *password = receiveStringData(socket_id);

printf("Username: %s", username);

比没有打印。但是,如果我添加一个换行符,它会完美打印......

printf("Username: %s\n", username);

我可以继续谈论这种行为,但是需要一段时间来列出所有内容,我觉得我正在做一些对经验更丰富的人来说非常明显的事情,所以我会在要求时提供更多细节但现在不会打扰。

这是相关的代码片段(这纯粹是服务器编码)......

bool authenticate(int socket_id);
char *receiveStringData(int socket_id);

int main(int argc, char *argv[])
{
    bool authenticated = false;

    if(!authenticated)
        authenticated = authenticate(new_fd);
}

bool authenticate(int socket_id)
{
    char *username = receiveStringData(socket_id);
    char *password = receiveStringData(socket_id);

    char *tempUsername = malloc(sizeof(char) * MAXDATASIZE);
    char *tempPassword = malloc(sizeof(char) * MAXDATASIZE);

    bool result = false;

    //This logic of course only works when we assume the text file is correct as is provided to us
    for(int i = 1; i <= userSize; i++)
    {
        //printf("Test1 ");
        int stringPos = 0;
        for(int j = 0; j < strlen(users[i]); j++)
        {
            if (users[i][j] == '\t' || users[i][j] == ' ')
            {
                stringPos++;
            }
            else if(stringPos > 0)
            {
                memcpy(tempUsername, users[i], sizeof(char) * (j - stringPos));
                memcpy(tempPassword, users[i] + (sizeof(char) * j), sizeof(char) * strlen(users[i]) - j);

                tempUsername[j - stringPos] = '\0';
                tempPassword[strlen(users[i]) - j] = '\0';

                break;
            }
        }
        //printf("Test    ");
        if (strcmp(tempUsername, username) == 0 && strcmp(tempPassword, password) == 0)
        {
            printf("IT WORKED");
            result = true;
        }
    }

    free(username);
    free(password);
    free(tempUsername);
    free(tempPassword);
    return result;
}

char *receiveStringData(int socket_id)
{
    int numbytes;
    char *buf = malloc(sizeof(char) * MAXDATASIZE);
    if ((numbytes = recv(socket_id, buf, MAXDATASIZE, 0)) == -1)
        perror("connect");

    buf[numbytes] = '\0';

    return buf;
}

0 个答案:

没有答案