2014-04-08 58 views
0

我再次:P,無論如何,我一直在努力的C程序,以允許用戶登錄到一個網站,非常非常基本。CGI使用C分割錯誤

但是我的代碼給了我一個分段錯誤。

信息通過HTML POST到C,然後將其存儲在.ssv文件 用戶名密碼

當從網站上運行它,我得到腳本頭過早結束,並從bash的運行時,通過,我得到分段錯誤。

這裏是我的代碼:

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
int main(void){ 
    char* s = malloc(100 * sizeof(char)); 
    char* s2 = malloc(100 * sizeof(char)); 
    int a=0; 

    printf("Content-type: text/html;charset=utf-8\n\n"); 
    printf("<html>\n"); 
    printf("<body>\n"); 
    printf("<h1>Form Feedback</h1>\n"); 
    int n = atoi(getenv("CONTENT_LENGTH"))+1; 
    char theString[n]; 
    fgets(theString, n, stdin); 
    // theString = getenv("QUERY_STRING"); 
    if(theString == NULL){ 
     printf("<h2>Error</h2>\n"); 
     return 0; 
    } 

    char parseValue[] = "&"; 
    char* str = strtok(theString, parseValue); 
// str = strtok(NULL, parseValue); 
    sscanf(str, "name=%s", s); 

    for (a=0; a<strlen(s); a++){ 
    if(s[a]=='+'){ 
     printf("<p>Please only use alfanumeric characters</p>");} 
    } 

// str = strtok(NULL, parseValue); 
    sscanf(str, "password=%s", s2); 


    for (a=0; a<strlen(s2); a++){ 
     if(s2[a]=='+'){ 
       printf("<p>Please only use alfanumeric characters</p>");} 
    } 


    printf("<br><br><h1>REGISTRATION COMPLETE</h1>"); 

    printf("</body>"); 
    printf("</html>"); 


    FILE *file; 
    file=fopen("members.ssv", "a+"); 
    if(file==NULL){return 1;} 
    sprintf(str,"%s %s\n",s,s2); 
    fwrite(str,1,sizeof(str),file); 
    fclose(file); 

    return 0; 
} 

太感謝你了,如果你能幫忙,我已經被困了好幾天一直。

編輯:我修復了segmentaton錯誤,並提前結束腳本頭。但是,當我看着我的members.ssv文件,我得到的東西像

文件的開始: 空白 *空白* @R

我不知道爲什麼!

+0

僅供參考,'(theString == NULL)'將永遠* *是真實的。你真的應該檢查你的圖書館電話的成功/失敗(在這個代碼中完成*一次*),或者[冒着神靈的憤怒](http://www.lysator.liu.se/c/ten- commandments.html)(參見命令#6)。 – WhozCraig

回答

1

您還沒有顯示你的代碼的一部分,導致段錯誤,也許你還沒有想出那麼多了,但工作後到前,我覺得這些東西是犯罪嫌疑人:

的sprintf(STR「 ...「,...); //從第5行開始。 **編輯

此時,s指向strtok的一個小令牌。內部結構不會很清楚。你只應該sprintf()到你知道大小的東西。這很可能是罪魁禍首。

也有可能strtok沒有以你期望的方式終止你的字符串;也許它永遠不會,或者你的下一個令牌可能不存在。你自己測試過你的strtok(),sscanf()方法嗎? memset()將s和s2緩衝區的整體設置爲'\ 0'。

而且,隨時隨地存儲密碼作爲字符串是dangerous.

+0

謝謝我將繼續努力,並且我知道這只是爲了讓我們熟悉CGI和HTML而完成的課程任務 – Norton

+0

如何修復sprintf?因爲s的值應該是USERNAME,而s2的值是密碼no?如果不是,那就是我需要它們的東西 – Norton

+0

最後一件事,我想可能是fgets有問題(theString,200,stdin);那是程序停止的地方。 – Norton