【问题】用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