c语言libcurl 使用实例get/post方法+c语言字符串处理

[cpp] view plaincopy

 

  1. #include <stdio.h>  
  2. #include <curl/curl.h>  
  3. #include <string.h>  
  4. #include <ctype.h>  
  5. #include <iconv.h>  
  6. #define TMP_FILE "tmp.html"  
  7. #define HTML_BUFFER_SIZE 1024*800  
  8.   
  9. void split(char **arr, char *str, const char *del) {  
  10.     char *s = strtok(str, del);  
  11.     while (s != NULL) {  
  12.         *arr++ = s;  
  13.         s = strtok(NULL, del);  
  14.     }  
  15. }  
  16.   
  17. /*将str1字符串中第一次出现的str2字符串替换成str3*/  
  18. void replaceFirst(char *str1, char *str2, char *str3) {  
  19.     char str4[strlen(str1) + 1];  
  20.     char *p;  
  21.     strcpy(str4, str1);  
  22.     if ((p = strstr(str1, str2)) != NULL)/*p指向str2在str1中第一次出现的位置*/ {  
  23.         while (str1 != p && str1 != NULL)/*将str1指针移动到p的位置*/ {  
  24.             str1++;  
  25.         }  
  26.         str1[0] = '/0'; /*将str1指针指向的值变成/0,以此来截断str1,舍弃str2及以后的内容,只保留str2以前的内容*/  
  27.         strcat(str1, str3); /*在str1后拼接上str3,组成新str1*/  
  28.         strcat(str1, strstr(str4, str2) + strlen(str2)); /*strstr(str4,str2)是指向str2及以后的内容(包括str2),strstr(str4,str2)+strlen(str2)就是将指针向前移动strlen(str2)位,跳过str2*/  
  29.     }  
  30. }  
  31.   
  32. /*将str1出现的所有的str2都替换为str3*/  
  33. void replace(char *str1, char *str2, char *str3) {  
  34.     while (strstr(str1, str2) != NULL) {  
  35.         replaceFirst(str1, str2, str3);  
  36.     }  
  37. }  
  38.   
  39. /*截取src字符串中,从下标为start开始到end-1(end前面)的字符串保存在dest中(下标从0开始)*/  
  40. void substring(char *dest, char *src, int start, int end) {  
  41.     char *p = src;  
  42.     int i = start;  
  43.     if (start > strlen(src))return;  
  44.     if (end > strlen(src))  
  45.         end = strlen(src);  
  46.     while (i < end) {  
  47.         dest[i - start] = src[i];  
  48.         i++;  
  49.     }  
  50.     dest[i - start] = '/0';  
  51.     return;  
  52. }  
  53.   
  54. /*返回src中下标为index的字符*/  
  55. char charAt(char *src, int index) {  
  56.     char *p = src;  
  57.     int i = 0;  
  58.     if (index < 0 || index > strlen(src))  
  59.         return 0;  
  60.     while (i < index)i++;  
  61.     return p[i];  
  62. }  
  63.   
  64. /*返回str2第一次出现在str1中的位置(下表索引),不存在返回-1*/  
  65. int indexOf(char *str1, char *str2) {  
  66.     char *p = str1;  
  67.     int i = 0;  
  68.     p = strstr(str1, str2);  
  69.     if (p == NULL)  
  70.         return -1;  
  71.     else {  
  72.         while (str1 != p) {  
  73.             str1++;  
  74.             i++;  
  75.         }  
  76.     }  
  77.     return i;  
  78. }  
  79.   
  80. /*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/  
  81. int lastIndexOf(char *str1, char *str2) {  
  82.     char *p = str1;  
  83.     int i = 0, len = strlen(str2);  
  84.     p = strstr(str1, str2);  
  85.     if (p == NULL)return -1;  
  86.     while (p != NULL) {  
  87.         for (; str1 != p; str1++)i++;  
  88.         p = p + len;  
  89.         p = strstr(p, str2);  
  90.     }  
  91.     return i;  
  92. }  
  93.   
  94. /*删除str左边第一个非空白字符前面的空白字符(空格符和横向制表符)*/  
  95. void ltrim(char *str) {  
  96.     int i = 0, j, len = strlen(str);  
  97.     while (str[i] != '/0') {  
  98.         if (str[i] != 32 && str[i] != 9)break; /*32:空格,9:横向制表符*/  
  99.         i++;  
  100.     }  
  101.     if (i != 0)  
  102.         for (j = 0; j <= len - i; j++) {  
  103.             str[j] = str[j + i]; /*将后面的字符顺势前移,补充删掉的空白位置*/  
  104.         }  
  105. }  
  106.   
  107. /*删除str最后一个非空白字符后面的所有空白字符(空格符和横向制表符)*/  
  108. void rtrim(char *str) {  
  109.     char *p = str;  
  110.     int i = strlen(str) - 1;  
  111.     while (i >= 0) {  
  112.         if (p[i] != 32 && p[i] != 9)break;  
  113.         i--;  
  114.     }  
  115.     str[++i] = '/0';  
  116. }  
  117.   
  118. /*删除str两端的空白字符*/  
  119. void trim(char *str) {  
  120.     ltrim(str);  
  121.     rtrim(str);  
  122. }  
  123.   
  124. //这是libcurl接收数据的回调函数,相当于recv的死循环  
  125. //其中stream可以自定义数据类型,这里我传入的是文件保存路径  
  126.   
  127. static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {  
  128.     int len = size * nmemb;  
  129.     int written = len;  
  130.     FILE *fp = NULL;  
  131.     if (access((char*) stream, 0) == -1) {  
  132.         fp = fopen((char*) stream, "wb");  
  133.     } else {  
  134.         fp = fopen((char*) stream, "ab");  
  135.     }  
  136.     if (fp) {  
  137.         fwrite(ptr, size, nmemb, fp);  
  138.     }  
  139.     // printf("%s\n",ptr);  
  140.     fclose(fp);  
  141.     return written;  
  142. }  
  143. //加上-lcurl库  
  144.   
  145. void test_post(char* url,char* data) {  
  146.     CURL *curl;  
  147.     CURLcode res;  
  148.     curl = curl_easy_init();  
  149.     if (curl) {  
  150.         //www.baidu.com/#wd=java  
  151.         curl_easy_setopt(curl, CURLOPT_URL, url);  
  152.         curl_easy_setopt(curl, CURLOPT_POST, 1L);  
  153.         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);  
  154.         res = curl_easy_perform(curl);  
  155.         curl_easy_cleanup(curl);  
  156.     }  
  157. }  
  158.   
  159. int file_exists(char *filename) {  
  160.     return (access(filename, 0) == 0);  
  161. }  
  162. int GetCharset(char *src_html,char *charCode) {  
  163.     char tmp_html[HTML_BUFFER_SIZE]={0};  
  164.     int pos = indexOf(src_html, "text/html; charset=");  
  165.     if (pos > 0) {  
  166.         strncpy(tmp_html, src_html + pos + strlen("text/html; charset="), strlen(src_html) - pos);  
  167.         pos = indexOf(tmp_html, "\"");  
  168.         if (pos > 0) {  
  169.             strncpy(charCode, tmp_html, pos);  
  170.         }  
  171.     }  
  172.     return 0;  
  173.   
  174. }  
  175.   
  176. void test_get(char* url) {  
  177.     CURL *curl;  
  178.     CURLcode res;  
  179.     curl = curl_easy_init();  
  180.     if (curl) {  
  181.         if (file_exists(TMP_FILE))  
  182.             remove(TMP_FILE);  
  183.         curl_easy_setopt(curl, CURLOPT_URL, url);  
  184.         //指定回调函数  
  185.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);  
  186.         //这个变量可作为接收或传递数据的作用  
  187.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, TMP_FILE);  
  188.         res = curl_easy_perform(curl);  
  189.         char tocode[64] = "UTF-8";  
  190.         if (CURLE_OK == res) {  
  191.             char *ct;  
  192.             res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);  
  193.             if ((CURLE_OK == res) && ct)  
  194.                 printf("We received Content-Type: %s\n", ct);  
  195.             //printf("====\n");  
  196.             //int pos=strcspn(ct,"UTF-8");   
  197.             int index = indexOf(ct, "=");  
  198.             char* arr[3];  
  199.             if (index > 0) {  
  200.                 split(arr, ct, "=");  
  201.                 //printf("%s\n", arr[1]);  
  202.                 strcpy(tocode, arr[1]);  
  203.             }  
  204.             FILE *fp = NULL;  
  205.             fp = fopen(TMP_FILE, "r");  
  206.             char src_html[HTML_BUFFER_SIZE]={0};  
  207.             char output_html[HTML_BUFFER_SIZE]={0};  
  208.             char tmp_html[HTML_BUFFER_SIZE]={0};  
  209.             if (fp) {  
  210.                 fread(src_html, HTML_BUFFER_SIZE, 1, fp);     
  211.                 strcpy(tmp_html,src_html);  
  212.                 if(index <0) {  
  213.                     GetCharset(tmp_html,tocode);  
  214.                     printf("%s\n",tocode);  
  215.                 }  
  216.                 int iRet;  
  217.                 //打开字符集转换    
  218.                 iconv_t hIconv = iconv_open(tocode,"iso-8859-1");  
  219.                 if (-1 == (int) hIconv) {  
  220.                     return -1; //打开失败,可能不支持的字符集    
  221.                 }       
  222.                 printf("%s\n",src_html);  
  223.                 //开始转换    
  224.                 iRet = iconv(hIconv, (char**) (&src_html), strlen(src_html), (char**) (&output_html), strlen(src_html));                  
  225.                 printf("%s\n", output_html);    
  226.                 printf("ok");  
  227.                 if(strcmp(output_html,"")==0)  
  228.                 {  
  229.                      printf("%s\n",src_html);  
  230.                 }  
  231.                 //关闭字符集转换    
  232.                 iconv_close(hIconv);  
  233.                    
  234.             }  
  235.   
  236.         }  
  237.         curl_easy_cleanup(curl);  
  238.     }  
  239. }  
  240.   
  241. int main(int argc, char* argv) {  
  242.     //printf("%s\n",argv[1]);  
  243.     //http://192.168.1.6:8080/TestServer/index.html?fdasf=123456&af=89  
  244.     test_post("http://192.168.1.6:8080/TestServer/index.html","wd=hava&hehe=123456");  
  245.     //test_get("http://www.baidu.com/");  
  246.     printf("\nok");  
  247.     return 0;  
  248. }  
时间: 2024-11-01 12:55:28

c语言libcurl 使用实例get/post方法+c语言字符串处理的相关文章

C语言实现BMP转换JPG的方法_C 语言

本文实例讲述了C语言实现BMP转换JPG的方法.分享给大家供大家参考.具体实现方法如下: /**************************************************************************** 名称: jpeg.c 功能: linux下bmp转化为jpeg程序源代码 日期: 2010.01.26 注意: 编译时加"-ljpeg"(gcc -o bmp2jpg jpeg.c -ljpeg) ***********************

C语言打印华氏-摄氏温度对照表的方法_C 语言

本文实例讲述了C语言打印华氏-摄氏温度对照表的方法.分享给大家供大家参考.具体实现方法如下: /* * 打印华氏-摄氏温度对照表 */ #include <stdio.h> /* 温度上限 */ #define MIN 20.0 /* 温度下限 */ #define MAX 300.0 /* 步长 */ #define BC 20.0 main() { /* 定义温度及上下限步常变量 */ float oc,of=1.0; /* 打印标题 */ printf("华氏-摄氏温度对照表\

C语言实现字母大小写转换的方法_C 语言

本文实例讲述了C语言实现字母大小写转换的方法.分享给大家供大家参考.具体实现方法如下: /* * 将大写字母转换为小写字母 */ #include <stdio.h> int lower(int c) { return ((c>='A')&&(c<='z'))?(c+'a'-'A'):(c); } main() { int i; char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for(i=0;i<26;i++)

使用C语言求N的阶乘的方法_C 语言

用递归法求N的阶乘 程序调用自身称为递归( recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解. 递归的能力在于用有限的语句来定义对象的无限集合. 一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. #include <stdio.h> #include <string.h> #include <stdlib.h> long factorial(int n) {

C语言求圆周率的简单实现方法_C 语言

本文实例讲述了C语言求圆周率的方法.分享给大家供大家参考,具体如下: #include <stdio.h> #include <math.h> void main() { int s; float n,t,pi; t=1,pi=0;n=1.0;s=1; while(fabs(t)>1e-6) { pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4; printf("pi=%10.6f/n",pi); } 此处得出的结果可精确到小数

用C语言求幂函数和指数函数的方法_C 语言

C语言pow()函数:求x的y次方(次幂)头文件: #include <math.h> pow() 函数用来求 x 的 y 次幂(次方),其原型为: double pow(double x, double y); pow()用来计算以x 为底的 y 次方值,然后将结果返回.设返回值为 ret,则 ret = xy. 可能导致错误的情况: 如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误. 如果底数 x 和指数 y 都是 0,可能会导致 domain erro

使用C语言解决字符串匹配问题的方法_C 语言

最常想到的方法是使用KMP字符串匹配算法: #include <stdio.h> #include <stdlib.h> #include <string.h> int get_nextval(char *pattern, int next[]) { //get the next value of the pattern int i = 0, j = -1; next[0] = -1; int patlen = strlen(pattern); while ( i &l

使用C语言判断英文字符大小写的方法_C 语言

C语言isupper()函数:判断字符是否为大写英文字母头文件: #include <ctype.h> 定义函数: int isupper(int c); 函数说明:检查参数c是否为大写英文字母. 返回值:若参数c 为大写英文字母,则返回非 0,否则返回 0. 附加说明:此为宏定义,非真正函数. 范例:找出字符串str 中为大写英文字母的字符. #include <ctype.h> main(){ char str[] = "123c@#FDsP[e?"; in

C语言解线性方程的四种方法_C 语言

发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归.经过半天的调试,仍找不出纠正的方法.因为并不是算法的问题,而是因为自己对编译器处理 浮点函数的方法不是很理解.明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对.不过如果没有浮点型 的话,这个程序应该算不错了 . 复制代码 代码如下: #include<stdio.h>#include<math.h>#include<mem.h>#define NUM 100v