使用HTML表单中的c程序获取数据

时间:2011-12-30 13:07:06

标签: html c forms

我创建了以下C程序来从HTML表单中获取数据。但是当我尝试编译并运行它时,我得到:

  

分段错误11(核心转储)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    char *N1,*N2,*N3,*N4,*N5;
    int cgi_length;
    char *cgi_data;
    printf("Content-type:text/html\n\n");
    cgi_length=atoi(getenv("CONTENT_LENGTH"));
    cgi_data=malloc(cgi_length+1);
    fread(cgi_data,1,cgi_length,stdin);
    printf("<HTML>");
    printf("<HEAD><TITLE>DATA</TITLE></HEAD><BODY>\n");
    printf("<H3>DATA</H3>\n");
    if(cgi_data == NULL)
    {
        printf("<P>Error! Error in passing data from form to script.");
    }
    else {
        printf("%s",cgi_data);
        sscanf(cgi_data,"N1=%s&N2=%s&N3=%S&N4=%SN5=%s",&N1,&N2,&N3,&N4,&N5);
        printf("<P>N1 is %s and N2 is %s and N3 is %S and N4 is %S and N5 is %s.",N1,N2,N3,N4,N5);
    }
}

此外,如果我使用ls命令查看 cgi-bin 目录中的数据,我会看到名为 myprogram.cgi.core 的文件是创建

有谁知道出了什么问题?

6 个答案:

答案 0 :(得分:1)

之前我遇到过同样的问题。我在fgets循环中使用了whilefread对我不起作用。试试这个:

cgi_length=atoi(getenv("CONTENT_LENGTH"));
    cgi_data=malloc(cgi_length+1);
    while(fgets(cgi_data,cgi_length,stdin)!=NULL){
//insert some processing here
}

答案 1 :(得分:0)

将coredump加载到GDB中。尝试类似:

 gdb myprogram.cgi myprogram.cgi.core

可能会将myprogram.cgi替换为CGI的正确名称。

当您在GDB中时,您可以通过在控制台中键入bt来查看应用程序崩溃的位置。

在这里,您可以找到有关如何使用GDB的快速教程:http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html

很少有笔记......:

  • 检查getenv返回的内容,可能返回NULL而不是环境变量的值。
  • sscanf将字符串的值复制到N1 N2 N3 N4 N5所指向的缓冲区中,为这些指针首先分配一些内存是明智的...
  • 您无需获取积分N1 N2 N3 N4 N5
  • 的参考
  • 正如Daniel Fischer所说:fread不会终止字符串。

答案 2 :(得分:0)

您必须检查getenv函数调用的返回值是否为空指针。将空指针传递给atoi是未定义的行为。我建议您还检查所有函数调用的返回值,并使用strtol函数而不是atoi,因为atoi无法检测错误。

答案 3 :(得分:0)

如果使用-Wall(所有警告)进行编译,它会让你知道出了什么问题

cgi.c: In function ‘main’:
cgi.c:23:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 5 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 6 has type ‘char **’ [-Wformat]
cgi.c:23:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 7 has type ‘char **’ [-Wformat]
cgi.c:24:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 4 has type ‘char *’ [-Wformat]
cgi.c:24:9: warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 5 has type ‘char *’ [-Wformat]
cgi.c:26:1: warning: control reaches end of non-void function [-Wreturn-type]

答案 4 :(得分:0)

有几个基本的C编程错误。使用例如找到其中的一些。例如,您将N1声明为字符指针但不初始化它,并将其地址作为参数传递。你需要以某种方式分配一个字符数组,并将指针作为参数传递给sscanf。

答案 5 :(得分:0)

我很确定你在这一行中得到零

cgi_length=atoi(getenv("CONTENT_LENGTH"));

检查是否实际定义了此环境变量。并且在分配内存之前以及在将一些数据放入其中之前,始终检查大小。