2012-04-26 85 views
1

我一直在使用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 

以下是編譯器的投訴:

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表單提交如果該信息是空白......

+0

不應'malloc(lpszContentLength + 1)'是'malloc(nContentLength + 1)'?同樣在'memset()'和'fread()'中...... – 2012-04-26 06:06:35

+0

這段代碼與C++沒有任何關係。該教程是可怕的。我建議先找到一本好的C++書,然後*參與CGI。 – 2012-04-26 16:22:46

+0

@KonradRudolph同意...我會嘗試其他的東西。 – varatis 2012-04-26 16:29:22

回答

1

這是一種鑄的問題與C++lpszBufferchar*,然而,malloc返回void*。所以你需要將它投射到char*。另請注意,您正試圖使用​​char*(lpszContentLength)作爲不正確的整數值。這必須在其他功能中更新 - 您已使用atoi功能更早地轉換它;所以使用該值。

所以該行應

lpszBuffer = (char*)malloc(nContentLength+1); 

最後,在源文件的開頭使用memset,你必須#include <string.h>

此外,作爲一種很好的做法(特別是腳本運行時間長的話),當您完成這些操作時,請不要忘記free。也就是說,當你不再使用它時,任何分配了malloc的東西都應該有free。所以,如果你使用lpszBuffer通過全功能,在函數結束根本就free(lpszBuffer);

+0

「'lpszBuffer'是一個'char *',但是'malloc'返回一個'void *',所以你需要將它轉換爲'char *'。」這實際上並不正確 - 在C中,不需要強制轉換,通常不建議使用 – 2012-04-26 06:38:40

+0

但是,如果您查看教程,則代碼絕對是C++。所以,演員陣容將是必需的,說它不是C++是不正確的。 – 2012-04-26 06:40:20

+0

我同意(我沒有看教程),這是'C++'代碼。他發佈的代碼片段有更多的細節提示'C'。但是,您認爲不建議在'C'中發生這樣的演員?從'malloc()'輸出結果是非常安全的,因爲它是你自己的「香草」內存塊。但更重要的是,這樣的轉換可以阻止編譯器不會發出警告(不應該發出警告)並提高代碼的可讀性。 – RageD 2012-04-26 12:57:06

0

error: invalid conversion from ‘char*’ to ‘size_t’

這是由試圖使用lpszContentLength(這是一個char*,在這種情況下可能代表字符的字符串引起的號碼),作爲size_t(通常是一個長整數)。要解決這個問題,您首先需要將lpszContentLength轉換爲整數值。爲此,我建議使用strtol(),因爲它會檢測到錯誤 - 您需要處理。

望着教程,他們已經將它轉換使用atoi()。您也可以通過在錯誤地嘗試使用lpszContentLength的任何地方使用nContentLength來修復此錯誤。他們的代碼必須從未經過測試。

請注意,atoi()未檢測到錯誤 - 因此,一旦完成了教程,通過適當的錯誤檢查更改爲strtol()將是一次不錯的學習練習。


error: invalid conversion from ‘void*’ to ‘char*’

這是由缺少強制轉換爲(char*)上的malloc的返回值造成的。在C++中,需要投:

lpszBuffer = (char*)malloc(convertedNumber+1); 

error: ‘memset’ was not declared in this scope

這是通過不包括用於memset的頭部而引起的。該man page for memset告訴你,你需要添加:

#include <string.h> 

error: invalid conversion from ‘char*’ to ‘size_t’

error: initializing argument 3 of ‘size_t fread(void*, size_t, size_t, FILE*)’

這些都造成lpszContentLength是字符的字符串,當它需要是一個整數類型。看到上面的第一個錯誤。

+0

謝謝了。我更新了代碼,但是我仍然遇到問題。見上面的更新。 – varatis 2012-04-26 16:18:33

+0

順便說一句我認爲這是關於POST數據爲空的事情(因爲腳本提交表單給自己)。但即使在執行atoi之前檢查sizeof(lpszContentLength)> 1,atoi似乎仍然會觸發並失敗。 – varatis 2012-04-26 16:21:26

+0

你知道嗎,沒關係。這個教程太可怕了。謝謝你的幫助 – varatis 2012-04-26 16:28:59