这是我为运行登录管理器的服务器编写的代码,它登录恶意访问的文件并打印出错误登录的结果。 字符 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/