比较C - strcmp中的字符串

Eri*_*ujo 0 c sockets string network-programming strcmp

我在比较C中的字符串时遇到了麻烦(我很擅长).我在此服务器应用程序上有套接字等待接受来自客户端的数据.在我的程序的这个特定部分,我希望能够根据从客户端收到的数据执行MySQL查询.我希望能够知道接收到的数据何时具有"newuser"的值以启动简单的注册过程.Strcmp返回正值1,我相信我应该得到0,因为值应该相等.

源代码:

//setup socket
//loop and select structure to handle multiple connections

if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) {
// got error or connection closed by client
    if (nbytes == 0) {
        // connection closed
        printf("selectserver: socket %d hung up\n", i);
    } else {
        perror("recv");
    }
    close(i); // bye!
    FD_CLR(i, &master); // remove from master set
} else {

    char check[] = "newuser";
    char fromUser[sizeof check];

    strncpy(fromUser,buf, sizeof check);
    printf("length of fromUser: %d\n", sizeof fromUser);
    printf("length of check: %d\n", sizeof check);
    printf("message from user: %s\n", fromUser);
    printf("check = %s \n", check);
    int diff = strcmp(fromUser, check);
    printf("compare fromUser to check: %d\n", diff);
    if ( strcmp(fromUser, check) == 0) {
        printf("aha! new user");
    }
Run Code Online (Sandbox Code Playgroud)

输出:

length of fromUser: 8
length of check: 8
newuser from user: newuser
check = newuser 
compare fromUser to check:
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,我没有正确处理传入缓冲区或错误地复制缓冲区.

Adr*_*iuk 6

strncpy最多复制 - 在这种情况下 - sizeof检查字节.如果nul字节不在该范围内,则不会复制.您可能会将"newuser"这个词作为较长句子的一部分,例如"newuser blah blah",所以你需要自己放置那个nul

strncpy(fromUser, buf, sizeof check);
fromUser[sizeof check - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)

或使用strlcpy,如果有的话.