このチュートリアルを使用して、C++ CGI スクリプトを作成しています。ただし、フォームの POST データを読み取ろうとすると、コンパイルされません。
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
コンパイラの苦情は次のとおりです。
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*)’
ここで、ln 12 は「lpszBuffer」で始まるものです。
私は 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フォームの送信と関係があると思います...