Html 基于C分割错误的CGI

Html 基于C分割错误的CGI,html,c,login,segmentation-fault,cgi,Html,C,Login,Segmentation Fault,Cgi,我再说一遍:p,无论如何,我一直在开发一个C程序,允许用户登录到一个网站,非常基本 然而,我的代码给了我一个分段错误 信息通过HTMLPOST传递到C,然后作为 用户名密码 当从站点运行它时,我会得到过早结束的脚本头,当从bash运行时,我会得到分段错误 这是我的密码: #include <stdlib.h> #include <string.h> #include <stdio.h> int main(void){ char* s = malloc(

我再说一遍:p,无论如何,我一直在开发一个C程序,允许用户登录到一个网站,非常基本

然而,我的代码给了我一个分段错误

信息通过HTMLPOST传递到C,然后作为 用户名密码

当从站点运行它时,我会得到过早结束的脚本头,当从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;
}
#包括
#包括
#包括
内部主(空){
char*s=malloc(100*sizeof(char));
char*s2=malloc(100*sizeof(char));
int a=0;
printf(“内容类型:text/html;charset=utf-8\n\n”);
printf(“\n”);
printf(“\n”);
printf(“表单反馈”);
int n=atoi(getenv(“内容长度”)+1;
字符串[n];
fgets(管柱,n,标准尺寸);
//字符串=getenv(“查询字符串”);
if(字符串==NULL){
printf(“错误\n”);
返回0;
}
字符解析值[]=“&”;
char*str=strtok(字符串,parseValue);
//str=strtok(NULL,parseValue);
sscanf(str,“name=%s”,s);

对于(a=0;a您没有指出代码的哪一部分导致了segfault,也许您还没有弄清楚,但是从前面开始,我发现这些事情值得怀疑:

sprintf(str,“…”,…);//从末尾算起的第五行。**已编辑

此时,s指向strtok的一个小标记。内部内容不太清楚。您应该只将sprintf()转换为您知道的大小。这很可能是罪魁祸首

也有可能strtok没有以您期望的方式对字符串进行nul终止;可能它永远不会终止,或者您期望的下一个标记不存在。您自己是否测试过strtok(),sscanf()方法?建议使用memset()'将整个s和s2缓冲区设置为'\0'


此外,将密码以字符串形式存储在任何位置都是

仅供参考,
(字符串==NULL)
永远不会为真。您确实应该检查库调用的成功/失败(在本代码中只执行一次)或(请参阅戒律6)谢谢,我会努力的,我知道这只是为了让我们熟悉CGI和HTMLH的课堂作业。我该如何修复sprintf?因为s处的值应该是USERNAME,s2应该是password no?如果不是,那就是我需要它们的最后一件事,我想fgets可能有问题(字符串,200,stdin);这就是程序暂停的地方。很抱歉,我键入了我从您那里引用的行。现在已更正。您有sprintf()到*str,它是您在strtok()中创建为指向子字符串的指针的。strtok()只保证您从中获得的是有效的子字符串,因此您将不会指示其分配的大小,并且可能不一定具有写入它的权限(仅读取它)。