2009-12-20 84 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。