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

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

(转)Objective-C语言--属性和实例变量

本文转自http://blog.csdn.net/addychen/article/details/39525681 使用Objective-C一段时间了,一直没有弄清楚在Objective-C中属性和实例变量,在这里总结一下,Objective-C中先有的实例变量,需要给外部类使用的用@public声明,内部自己使用的用@private或@protect声明.Objective-C添加了属性后,我觉得Apple的考虑应该是,属性用于对外而实力变量主要用于程序内部使用.这样有利于代码的分离,由于

OC实例变量初始化方法

OC实例变量初始化方法1. 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx2. 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3.使用实例初始化方法 initWith开头的方法4.使用构造器 类名+With…以Person  Student两个类为例1. 使用实例 setter方法这是最麻烦的方法 @interface Person : NSObject { NSString *_name; NSString *_sex

Swift语言中的集合类——字典 使用方法

字典 字典是一种存储相同类型多重数据的存储器.每个值(value)都关联独特的键(key),键作为字典中的这个值数据的标识符.和数组中的数据项不同,字典中的数据项并没有具体顺序.我们在需要通过标识符(键)访问数据的时候使用字典,这种方法很大程度上和我们在现实世界中使用字典查字义的方法一样. Swift 的字典使用时需要具体规定可以存储键和值类型.不同于 Objective-C 的NSDictionary和NSMutableDictionary 类可以使用任何类型的对象来作键和值并且不提供任何关于

Eclipse 官方简体中文语言包下载地址及安装方法

Eclipse 官方简体中文语言包下载地址及安装方法 打开Eclipse Babel Project 主页: http://www.eclipse.org/babel/downloads.php 根据Eclipse的版本找到相应的插件地址,复制下来. 进入Eclipse,选择Help->Install New Software... 点击Add按钮,把刚才复制的地址粘贴到Location:,再随便取一个名字. 等待Pending一会儿,再在Babel Language Packs in Chin

discuz 模板中如何使用方法和语言标签?

第一个问题:如何调用方法? 关于模板中eval的使用{eval php 语句}比如:<!--{eval echo "Hello World!"}--> 工作中遇到一个小问题,discuz的手机模板中,需要切换收藏和取消收藏. 取消收藏,需要找到forum/viewthread.htm .forum/viewthread_node.htm 模板,在viewthread_node模板中修改取消收藏的 最低层代码 /source/include/spacecp/spacecp_f

[C/C++基础] C语言常用函数strlen的使用方法

函数声明:extern unsigned int strlen(char *s); 所属函数库:<string.h> 功能:返回s所指的字符串的长度,其中字符串必须以'\0'结尾 参数:s为字符串的初始地址 使用举例: 代码如下 编译运行结果 说明: 函数strlen比较容易理解,其功能和sizeof很容易混淆.其中sizeof指的是字符串声明后占用的内存长度,它就是一个操作符,不是函数:而strlen则是一个函数,它从第一个字节开始往后数,直到遇见了'\0',则停止. [C/C++基础] C

c语言函数指针实例

如果使用typedef 是这样的 //可以把一个小写字母变成大写 //char (*pFun)(char); typedef char (*PTRFUN)(char); PTRFUN pFun; char glFun(char a){ return a & 223;} void print(int a,PTRFUN call){ cout<<call(a)<<endl;}void main() { pFun = glFun; print('a',pFun);} 如果不使用t

[C/C++基础] C语言常用函数memset的使用方法

函数声明:void *memset(void *s, int ch, size_t n); 用途:为一段内存的每一个字节都赋予ch所代表的值,该值采用ASCII编码. 所属函数库:<memory.h> 或者 <string.h> 参数:(1)s,开始内存的地址:(2)ch和n,从地址s开始,在之后的n字节长度内,把每一个字节的值都赋值为n. 使用举例: 代码如下 编译运行结果 说明: 该函数最常用的用途就是将一段新分配的内存初始化为0.例如我们代码的第9-10行. 需要注意的是,函

利用C语言编辑画图程序的实现方法

不知道大家在进行开发县级电网调度自动化系统的时候,是否都会遇到一个问题就是:要绘制一个电力系统一次接线图.大家都应该知道其实电力系统的一次接线图是较为复杂的,如果想要使用一般的编程方法来进行绘制的话,基本上就是行不通的.那么我们应该怎样才可以更加的高效直接呢?今天小编就会给大家介绍一个方法,那就是:利用C语言编辑画图程序的实现方法.希望这篇教程对于大家有所帮助. 一.实现方法 在教程开始之前,小编先为大家介绍一下在编程程序里面早已定义了几个特殊按钮.为什么小编要为大家介绍这几个特殊按钮呢?那是因