cgi如何提取表单post的特殊子串

【问题】用c编写cgi程序如何取出html表单post来的数据?

【分析】html表单post来的数据形如username="zhang"&&password="123456"&&useid="012"

【方法1】

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
char* getcgidata(FILE* fp, char* requestmethod);
int main()
{
char *input;
char *req_method;
char name[64];
char pass[64];
char userid[64];
int i = 0;
int j = 0;
// printf("Content-type: text/plain; charset=iso-8859-1\n\n");
printf("Content-type: text/html\n\n");
printf("The following is query reuslt:<br><br>");
req_method = getenv("REQUEST_METHOD");
input = getcgidata(stdin, req_method);

for ( i = 9; i < (int)strlen(input); i++ )
{
if ( input[i] == '&' )
{
name[j] = '\0';
break;
} 
name[j++] = input[i];
}

for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )
{
if ( input[i] == '&' )
{
pass[j] = '\0';
break;
} 
pass[j++] = input[i];
}

for ( i = 30 + strlen(pass)+ strlen(name), j = 0; i < (int)strlen(input); i++ )
{
userid[j++] = input[i];
}

userid[j] = '\0';
printf("Your Username is %s<br>Your Password is %s<br>Your userid is %s<br> \n", name, pass,userid);
return 0;
}
char* getcgidata(FILE* fp, char* requestmethod)
{
char* input;
int len;
int size = 1024;
int i = 0;
if (!strcmp(requestmethod, "GET"))
{
input = getenv("QUERY_STRING");
return input;
}
else if (!strcmp(requestmethod, "POST"))
{
len = atoi(getenv("CONTENT_LENGTH"));
input = (char*)malloc(sizeof(char)*(size + 1));
if (len == 0)
{
input[0] = '\0';
return input;
}
while(1)
{
input[i] = (char)fgetc(fp);
if (i == size)
{
input[i+1] = '\0';
return input;
}
--len;
if (feof(fp) || (!(len)))
{
i++;
input[i] = '\0';
return input;
}
i++;
}
}
return NULL;
}


【方法2】

1 先将post来的数据整体读入info

char *info=NULL;
 
 char username[64];
 char passwd[64];
 int userid;

 
 int lenstr=0;

 memset(username,0,64);
 memset(passwd,0,64);
 userid=0; 
/*
* Get the data by post method from index.html
*/
 lenstr=atoi(getenv("CONTENT_LENGTH"));
 info=(char *)malloc(lenstr+1);
 fread(info,1,lenstr,stdin);

 2 将info作为文件流输入,利用sscanf提取子串

 sscanf(info,"username=%[^&]&passwd=%[^&]&userid=%d",username,passwd,&userid);
 free(info);

 注:如果数据为实型,则利用sscanf时,要加上&,如上例userid

 

【思考】如果子串为username=zhang; passwd=123; userid=012,如何用【方法2】提取?

sscanf(info,"username=%[^;]; passwd=%[^;]; userid=%d",&username,&passwd,&userid);

注意:将%[^&]&替换为%[^;];。通过本例,可以明白%[^;];的用法。

【解析】%[^&]是正则表达式,详细请参考:

http://blog.chinaunix.net/space.php?uid=9195812&do=blog&cuid=499274

你可能感兴趣的:(html,正则表达式,cgi,query,input,FP)