为什么put函数不适用于C ++中socket的输入char?

时间:2011-10-11 21:57:34

标签: c sockets concatenation c-strings null-terminated

这是我运行登录管理器的服务器的代码,即登录恶意访问的文件并打印出错误登录的结果。 chars user和pass来自使用套接字的用户输入。

if ((memcmp(user, "admin", strlen("admin")) == 0)) {
    /*code... */
}
else {
    char msg[600];
    strcpy (msg,"Login error with ");
    strcat (msg,"user: ");
    strcat (msg,user);
    strcat (msg," password: ");
    strcat (msg,pass);
    strcat (msg," from: ");
    strcat (msg, client_ip);
    puts (msg);
    logfile->Write(msg);
    return false;
}

嗯,问题是输出控制台和日志文件中的输出。

像这样:

Login error with user: lol

 password: asd

:��ܔ��P{w� from: 127.0.0.1

为什么有奇怪的asci字符? 如何避免新行,因为它们来自socket的用户输入?

2 个答案:

答案 0 :(得分:2)

正如多个人所评论的那样,这段代码不包含特定于C ++的内容,所以我回答的问题就好像你在普通的C中工作一样。

我猜,因为你使用上面的memcmp,你的输入字符串不会以空值终止。 strcat将继续追踪char来自指针徘徊的内容,直到它遇到'\0'。如果要将用户或密码用作C风格的字符串,则需要添加空终止符,否则使用strncat并传递长度。

另外,请注意超越msg。使用snprintf格式化邮件可能会更好,因为它接受最大输出字符串长度。

答案 1 :(得分:1)

通过这种方式,您可以使代码更小一些

if (strcmp(user, "admin") == 0) {
    /* yahoo, admin! */
}
else {
    char buff[256];
    snprintf(buff, sizeof(buff),
            "Login error with user: %s password: %s from: %s",
            user,
            pass,
            client_ip);
    printf("%s\n", buff);
    logfile->Write(buff);
    return false;
}

在if语句之前添加此额外代码,您可以确保字符串有效

printf("user, len:%d, value: %s\n", strlen(user), user);
printf("pass, len:%d, value: %s\n", strlen(pass), pass);
printf("client_ip, len:%d, value: %s\n", strlen(client_ip), client_ip);