首页 > 代码库 > cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息

cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息

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

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

【方法1】lainco


#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

[html] view plaincopy
  1. char *info=NULL;  
  2.    
  3.  char username[64];  
  4.  char passwd[64];  
  5.  int userid;  
  6.   
  7.    
  8.  int lenstr=0;  
  9.   
  10.  memset(username,0,64);  
  11.  memset(passwd,0,64);  
  12.  userid=0;   
  13. /*  
  14. * Get the data by post method from index.html  
  15. */  
  16.  lenstr=atoi(getenv("CONTENT_LENGTH"));  
  17.  info=(char *)malloc(lenstr+1);  
  18.  fread(info,1,lenstr,stdin);  

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

[html] view plaincopy
  1. sscanf(info,"username=%[^&]&passwd=%[^&]&userid=%d",username,passwd,&userid);  
  2. free(info);  

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

 

【思考】假设子串为username=zhang; passwd=123; userid=012,怎样用【方法2】提取?

[html] view plaincopy
  1. sscanf(info,"username=%[^;]; passwd=%[^;]; userid=%d",&username,&passwd,&userid);  

注意:将%[^&]&替换为%[^;];。

通过本例,能够明确%[^;];的使用方法。

【解析】%[^&]是正則表達式,具体请參考:

uid=9195812&do=blog&cuid=499274" style="color:rgb(51,102,153); text-decoration:none">http://blog.chinaunix.net/space.php?uid=9195812&do=blog&cuid=499274

cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息