c - 为什么 puts 函数不适用于 C++ 中来自套接字的输入字符?

标签 c sockets concatenation c-strings null-terminated

这是我为运行登录管理器的服务器编写的代码,它登录恶意访问的文件并打印出错误登录的结果。 字符 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字符? 由于它们来自套接字的用户输入,如何避免换行?

最佳答案

正如许多人评论的那样,这段代码不包含任何特定于 C++ 的内容,所以我的回答就好像您在使用纯 C 语言一样。

我猜,因为您在上面使用了 memcmp,所以您的输入字符串不是空终止的。 strcat 将继续从指针漫游到的任何地方附加 char,直到遇到 '\0'。如果要将用户或密码用作 C 样式字符串,则需要添加空终止符,否则使用 strncat并传递长度。

此外,请注意 msg 溢出。使用 snprintf 可能会有更好的运气格式化您的消息,因为它接受最大输出字符串长度。

关于c - 为什么 puts 函数不适用于 C++ 中来自套接字的输入字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7733022/

相关文章:

c++ - 一次从套接字读取 1 个字节与读取大块

c# - SIM800L从c#向arduino发送数据的问题

c - 用 malloc 初始化字节数组有问题吗?

javascript - Angular 最佳实践 : Lazyload vs Concatenation

javascript 循环中的变量串联

c - 使用单独的方法是正确的解决方案吗?

C++ 网络套接字、SCTP 和数据包大小

c# - 从 C# 中的另一个线程修改类属性

java - JODConverter问题

c# - 你如何在 C# 中连接列表?