Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418123
  • 博文数量: 48
  • 博客积分: 1032
  • 博客等级: 上士
  • 技术积分: 1256
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-19 13:24
文章分类

全部博文(48)

文章存档

2014年(3)

2013年(23)

2012年(22)

分类: Web开发

2013-04-02 17:16:23

闲来无事对cgi的操作进行了一个简单封装;
仿照php对变量的读取方法,在php中存在了全局数组$_GET[]、$_POST[]和$_REQUET[],这里我定义了个结构体(kv)来模拟这种全局数组;主要的作用就是讲键值对进行分离而已;

cgi_decode.c


点击(此处)折叠或打开

  1. #include "cgi_decode.h"

  2. char *Z_GET(const char *key,kv *keyValues){
  3.     int res = 0;
  4.     int index = 0;
  5.     int count = keyValues -> count;
  6.     for(index = 0; index < count; index++ ){
  7.         res = strcmp(key,keyValues -> key[index]);
  8.         if(res == 0){
  9.             //查询到该key值对应的value
  10.             return keyValues -> values[index];
  11.         }
  12.     }
  13.     return NULL;
  14. }

  15. int get_keyValues(kv *keyValues)
  16. {
  17. /*******************从环境变量中取值*************************************/
  18.     char *method = NULL;
  19.     char *my_data = NULL;
  20.     char *tmp_ptr = NULL;
  21.     int data_len = 0;
  22.     /* 窗体以GET 方式传数据*/
  23.     method=getenv("REQUEST_METHOD");
  24.     if( strcmp(method,"GET") == 0)
  25.     {
  26.         tmp_ptr=getenv("QUERY_STRING");
  27.         data_len = strlen(tmp_ptr);
  28.         my_data = (char *)malloc(sizeof(char)*(data_len+1));
  29.         strcpy(my_data,getenv("QUERY_STRING"));
  30.         my_data[data_len]='\0';
  31.     }
  32.     /* 窗体以POST 方法传数据*/
  33.     if(strcmp(method,"POST") == 0)
  34.     {
  35.         data_len = atoi(getenv("CONTENT_LENGTH"));
  36.         my_data = (char *) malloc(sizeof(char)*(data_len + 1));
  37.         fread(my_data,1,data_len,stdin);
  38.     }
  39. /*******************根据&取得键值对*************************************/
  40.     //char my_data[] = "name=hello&password=jiuzhou&value=12.3";
  41.     char delims[] = "&";
  42.     char *result = NULL;
  43.     int len;
  44.     len = 0;
  45.     result = strtok(my_data,delims);
  46.     while(result != NULL){
  47.         /* get the key_value */
  48.         strcpy(keyValues -> keyValues[len++],result);
  49.         result = strtok(NULL,delims);
  50.     }
  51.     keyValues -> count = len;
  52. /*******************根据=取得各个键值*************************************/
  53.     int i = 0;
  54.     int flag = 0;
  55.     char *data = NULL;
  56.     char kv[] = "=";
  57.     char *res = NULL;
  58.     for( i = 0; i < len; i++){
  59.         flag = 0;
  60.         data = keyValues -> keyValues[i];
  61.         res = strtok(data,kv);
  62.         while(res != NULL){
  63.             if(flag == 0){
  64.                 strcpy(keyValues -> key[i],res);
  65.                 flag++;
  66.             }
  67.             else{
  68.                 strcpy(keyValues -> values[i],res);
  69.             }
  70.             res = strtok(NULL,kv);
  71.         }
  72.     }
  73.     return len;
  74. }

cgi_decode.h


点击(此处)折叠或打开

  1. /*********
  2. // name : cgi_decode.h
  3. // author : zxc
  4. // date : 2013/4/2
  5. **********/
  6. #ifndef CGI_DECODE_H
  7. #define CGI_DECODE_H

  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <malloc.h>

  12. #define KEY_VALUE 20
  13. #define VALUE_LENGTH 20
  14. #define KEYVALUE_LENGTH 40
  15. typedef struct _key_value{
  16.     char keyValues[KEY_VALUE][KEYVALUE_LENGTH];
  17.     char key[KEY_VALUE][VALUE_LENGTH];
  18.     char values[KEY_VALUE][VALUE_LENGTH];
  19.     int count;
  20. }kv;

  21. int get_keyValues(kv *keyValues);
  22. char *Z_GET(const char *key,kv *keyValues);

  23. #endif

测试:curl ''

点击(此处)折叠或打开

  1. #include "cgi_decode.h"

  2. int main(void)
  3. {
  4.     printf("Content-type: text/html\n\n");
  5.     kv my_kv;
  6.     int count = get_keyValues(&my_kv);//从环境变量中取值保存在结构体中
  7.     char *value = NULL;
  8.     value = Z_GET("name",&my_kv);//根据键去查询对应的值
  9.     if(value){
  10.         printf("the value is : %s\n",value);
  11.     }
  12.     else{
  13.         printf("no result!\n");
  14.     }
  15.     return 0;
  16. }


阅读(3046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~