2013-04-09 48 views
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),而不會崩潰我的項目? Thans很多。C++約GET和sprintf

+0

如果你打開它們,你可能會得到一個警告(多於一個)。 – chris 2013-04-09 22:11:03

回答

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); 
+0

我沒有以這種方式從網上得到任何迴應。任何想法爲什麼? – OrrGorenn 2013-04-09 22:25:21

+0

@ user2263821:不知道非正式 - 它應該和你嘗試的代碼一樣。可能會嘗試打印出'mybuf'來查看你所得到的。 – 2013-04-09 22:26:40

+0

明白了。非常感謝。非常有幫助! – OrrGorenn 2013-04-09 22:35:36

2

char *mybuf只是給你一個char指針,沒有別的。您需要實際分配char緩衝區,以便sprintf可以將結果寫入其中。試着做一個數組,而不是(避免做手工的內存管理):

char mybuf[SIZE]; 

替換SIZE你想要的緩衝區的大小是什麼。

但是,我擔心你認爲你在編寫C++。這看起來更像是C.

+1

並使用'snprintf'而不是'sprintf'來避免溢出緩衝區。 – jamesdlin 2013-04-09 22:17:01

+0

@jamesdlin是的,那也是! :D – 2013-04-09 22:17:34