私はthis tutorialを使ってC++ CGIスクリプトを作っています。私は、フォームのPOSTデータを読み取るしようとすると、しかし、それはコンパイルしていない:C++ CGIスクリプト、フォームデータを読む
char* lpszContentLength = getenv("CONTENT_LENGTH");
char* lpszBuffer;
int nContentLength = atoi(lpszContentLength);
lpszBuffer = malloc(lpszContentLength+1); // allocate a buffer
memset(lpszBuffer, 0, lpszContentLength+1); // zero it out
fread(lpszBuffer,1,lpszContentLength,stdin); // get data
ここでは、コンパイラの不満です:
LN 12が「lpszBuffer」で始まるものですcgi.cpp: In function ‘int main()’:
cgi.cpp:12: error: invalid conversion from ‘char*’ to ‘size_t’
cgi.cpp:12: error: initializing argument 1 of ‘void* malloc(size_t)’
cgi.cpp:12: error: invalid conversion from ‘void*’ to ‘char*’
cgi.cpp:13: error: ‘memset’ was not declared in this scope
cgi.cpp:15: error: invalid conversion from ‘char*’ to ‘size_t’
cgi.cpp:15: error: initializing argument 3 of ‘size_t fread(void*, size_t, size_t, FILE*)’
。
私はC++の新機能ですので、これを修正する方法がわからないのですが、なぜこれが起こっているのでしょうか。多分古くなったコードかもしれません...私は、喜んでPOSTリクエストからデータを読み込むための他の解決策を受け入れるでしょう。
編集: 皆さんの修正に応じてコードを更新しました。
char* lpszContentLength = getenv("CONTENT_LENGTH");
char* lpszBuffer;
int nContentLength = atoi(lpszContentLength);
lpszBuffer = (char*)malloc(nContentLength+1); // allocate a buffer
memset(lpszBuffer, 0, nContentLength+1); // zero it out
fread(lpszBuffer,1,nContentLength,stdin); // get data
しかし、私はまだATOIからセグメンテーションフォールトを取得:
==23419== Invalid read of size 1
==23419== at 0x498DA8C: ____strtol_l_internal (strtol_l.c:298)
==23419== by 0x498D7EF: strtol (strtol.c:110)
==23419== by 0x498AB60: atoi (atoi.c:28)
==23419== by 0x8048899: main (in .../cgi.cpp.cgi)
==23419== Address 0x0 is not stack'd, malloc'd or (recently) free'd
は、ここでの問題は何ですか? POSTが空白の場合にPOSTフォームの送信と関係があると仮定しています。
malloc(lpszContentLength + 1)は 'malloc(nContentLength + 1)'であるべきですか? 'memset()'と 'fread()'にも... –
このコードはC++とは関係ありません。チュートリアルは恐ろしいです。最初に、良いC++の本を見つけて、CGIで*やってみることをお勧めします。 –
@KonradRudolph合意しました...私は代わりに他のものを試してみます。 – varatis