2009-12-20 87 views
3

我是新來的C/C++遊戲,所以我認爲我在做一個新手的錯誤:段錯誤中的atoi(STR)

int main(){ 
    char* clen; 
    clen = getenv("CONTENT_LENGTH"); 
    if (clen==NULL){ 
    cout << "No such ENV var: CONTENT_LENGTH"<<endl; 
    exit(0); 
    } 
    int cl = 0; 
    cl = atoi(clen); 
    if (cl < 1){ 
    return inputPage(); 
    } 

    // if there is no content, we assume that this is a fresh request, 
// so we showed the input page, otherwise, we'll return dispatch to 
    //the processing code. 
    postTest(clen); 

} 

這應該是一個CGI腳本。據我可以告訴GDB,打印語句等這段代碼segfaults在行「cl = atoi(clen);」我不知道這是爲什麼。 K & R表明這是正確的。我基本上從其他半數在線教程中複製了這一行。它似乎昨天晚上工作!我完全被難住了。

+3

您發佈的代碼看起來不錯,但它是真實的代碼嗎?您是否將其複製並粘貼到SO中,或者您是否重新輸入了它? – 2009-12-20 19:28:05

+0

複製和粘貼,只需從emacs直接複製和粘貼 – Ben 2009-12-20 19:44:13

回答

2

我不相信它真的崩潰上的atoi()

能否請您試試這個代碼?

#include <iostream> 
#include <stdlib.h> 
#ifndef NULL 
#define NULL 0 
#endif 

using namespace std; 

int main(){ 
    char* clen; 
    clen = getenv("CONTENT_LENGTH"); 
    if (clen==NULL){ 
    cout << "No such ENV var: CONTENT_LENGTH"<<endl; 
    exit(0); 
    } 
    int cl = 0; 
    cl = atoi(clen); 
    if (cl < 1){ 
        std::cout << "return inputPage();" << std::endl; 
        return 0; 
    } 

    std::cout << "postTest();" << std::endl; 

} 

編譯它例如到「app」,並用CONTENT_LENGTH的一些變化來運行它,例如

./app 
CONTENT_LENGTH=4 ./app 
CONTENT_LENGTH=-4 ./app 
CONTENT_LENGTH=a ./app 
+0

好吧,看起來這個想法是我需要的領導。對於那些對家庭感興趣的人,我在一個學校集羣上運行它,並且似乎沒有訪問我需要的apache日誌而沒有跟蹤教授,在這個學期的這一點上,這是一個棘手的問題任務。不過,謝謝,我認爲事情正在擡頭...... – Ben 2009-12-20 19:50:05

1

除非編譯器錯誤和竊聽的getenv()實現我會說,這是不可能的代碼就cl = atoi(clen)段錯誤。這是因爲getenv()返回NULL或一個有效的指向空終止字符數組的指針(這只是C字符串的一種奇特方式)。

由於NULL情況下對抗,最有可能的檢查程序(它不是一個「腳本」)崩潰別處。

編輯:你怎麼知道它甚至崩潰?它是否顯示HTTP 500錯誤?如果是,很可能你只是忘了cout << "Content-type: text/html\n\n"。 Web服務器日誌說什麼?

EDIT2:與您的問題無關,但通常使用C函數如atoi()令人不悅; C++版本lexical_cast(在TR1和boost中實現)是首選。

+0

是的,500錯誤。好的,這不是一個腳本,夠公平的。感謝lexical_cast提示,但是我不得不說,在我編程的世界裏,C++在...上皺着眉頭;) – Ben 2009-12-20 19:51:46

0

你寫你一直在尋找它與GDB。難道只有挖掘(步驟)到atoi()函數調用才能更好地瞭解發生了什麼?我假設你確保它永遠不會通過atoi()調用的線路?

0

事實證明,這是不以任何方式與一般的atoi,或C++的問題。問題是我忘記了一個非常基本的CGI要點,那就是GET中沒有CONTENT_LENGTH,這是瀏覽器的第一次調用不可避免的。因此,我試圖擺弄那個無效的clen。只要我發現沒有CONTENT_LENGTH屬性,我只需要返回inputPage。