我创建了以下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 的文件是创建
有谁知道出了什么问题?
答案 0 :(得分:1)
之前我遇到过同样的问题。我在fgets
循环中使用了while
。 fread
对我不起作用。试试这个:
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
答案 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"));
检查是否实际定义了此环境变量。并且在分配内存之前以及在将一些数据放入其中之前,始终检查大小。