3

我是 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、打印语句等,此代码段错误位于“cl = atoi(clen);”行 我不知道为什么会这样。K&R 认为这是正确的。我基本上从其他六个在线教程中复制了这一行。它似乎在昨晚工作!我完全被难住了。

4

4 回答 4

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
于 2009-12-20T19:38:47.773 回答
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 中实现)。

于 2009-12-20T19:28:37.463 回答
0

事实证明,这绝不是 atoi 或一般 C++ 的问题。问题是我忘记了一个非常基本的 CGI 点,即 GET 中没有 CONTENT_LENGTH,这是浏览器第一次调用不可避免的。因此,我试图摆弄为空的 clen。一旦发现没有 CONTENT_LENGTH 属性,我只需要返回 inputPage。

于 2009-12-22T16:42:32.007 回答
0

你写你一直在用 GDB 看它。难道不应该只挖掘(步骤)到 atoi() 函数调用以更好地了解发生了什么吗?我假设您确保它永远不会到达 atoi() 调用之后的行?

于 2009-12-20T19:51:22.417 回答