我是C / C ++游戏的新手,所以我假设我犯了一个菜鸟错误:
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,print语句等,这段代码会在“cl = atoi(clen);”行中出现段错误。我不知道为什么会这样。 K&amp; R表明这是正确的。我基本上从其他六个在线教程中复制了这一行。它似乎在昨晚工作!我完全难过了。
答案 0 :(得分: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
答案 1 :(得分:1)
除了编译器错误和bugged getenv()实现之外,我会说这段代码不可能在cl = atoi(clen)
上进行段错误。这是因为getenv()返回NULL或指向空终止字符数组的有效指针(这只是说C字符串的一种奇特方式)。
由于检查了NULL情况,因此很可能程序(它不是“脚本”)在其他地方崩溃。
编辑:你怎么知道它甚至崩溃了?它是否显示HTTP 500错误?如果是,您很可能只是忘了cout << "Content-type: text/html\n\n"
。 Web服务器日志说什么?
EDIT2 :与您的问题无关,但通常使用像atoi()
这样的C函数不受欢迎; C ++版本lexical_cast
(在TR1和boost中实现)是首选。
答案 2 :(得分:0)
你写道你一直在用GDB看它。不应该只是挖掘(步骤)到atoi()函数调用,以更好地了解正在发生的事情?我假设你确定它永远不会通过atoi()调用到达?
答案 3 :(得分:0)
事实证明,这对于atoi或者一般来说与C ++没有任何关系。问题是我忘记了一个非常基本的CGI点,即GET中没有CONTENT_LENGTH,这是浏览器不可避免的第一次调用。因此,我试图摆弄无效的clen。我发现没有CONTENT_LENGTH属性时,我只需要返回inputPage。