c语言libcurl 使用实例get/post方法+c语言字符串处理
- #include <stdio.h>
- #include <curl/curl.h>
- #include <string.h>
- #include <ctype.h>
- #include <iconv.h>
- #define TMP_FILE "tmp.html"
- #define HTML_BUFFER_SIZE 1024*800
- void split(char **arr, char *str, const char *del) {
- char *s = strtok(str, del);
- while (s != NULL) {
- *arr++ = s;
- s = strtok(NULL, del);
- }
- }
- /*将str1字符串中第一次出现的str2字符串替换成str3*/
- void replaceFirst(char *str1, char *str2, char *str3) {
- char str4[strlen(str1) + 1];
- char *p;
- strcpy(str4, str1);
- if ((p = strstr(str1, str2)) != NULL)/*p指向str2在str1中第一次出现的位置*/ {
- while (str1 != p && str1 != NULL)/*将str1指针移动到p的位置*/ {
- str1++;
- }
- str1[0] = '/0'; /*将str1指针指向的值变成/0,以此来截断str1,舍弃str2及以后的内容,只保留str2以前的内容*/
- strcat(str1, str3); /*在str1后拼接上str3,组成新str1*/
- strcat(str1, strstr(str4, str2) + strlen(str2)); /*strstr(str4,str2)是指向str2及以后的内容(包括str2),strstr(str4,str2)+strlen(str2)就是将指针向前移动strlen(str2)位,跳过str2*/
- }
- }
- /*将str1出现的所有的str2都替换为str3*/
- void replace(char *str1, char *str2, char *str3) {
- while (strstr(str1, str2) != NULL) {
- replaceFirst(str1, str2, str3);
- }
- }
- /*截取src字符串中,从下标为start开始到end-1(end前面)的字符串保存在dest中(下标从0开始)*/
- void substring(char *dest, char *src, int start, int end) {
- char *p = src;
- int i = start;
- if (start > strlen(src))return;
- if (end > strlen(src))
- end = strlen(src);
- while (i < end) {
- dest[i - start] = src[i];
- i++;
- }
- dest[i - start] = '/0';
- return;
- }
- /*返回src中下标为index的字符*/
- char charAt(char *src, int index) {
- char *p = src;
- int i = 0;
- if (index < 0 || index > strlen(src))
- return 0;
- while (i < index)i++;
- return p[i];
- }
- /*返回str2第一次出现在str1中的位置(下表索引),不存在返回-1*/
- int indexOf(char *str1, char *str2) {
- char *p = str1;
- int i = 0;
- p = strstr(str1, str2);
- if (p == NULL)
- return -1;
- else {
- while (str1 != p) {
- str1++;
- i++;
- }
- }
- return i;
- }
- /*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/
- int lastIndexOf(char *str1, char *str2) {
- char *p = str1;
- int i = 0, len = strlen(str2);
- p = strstr(str1, str2);
- if (p == NULL)return -1;
- while (p != NULL) {
- for (; str1 != p; str1++)i++;
- p = p + len;
- p = strstr(p, str2);
- }
- return i;
- }
- /*删除str左边第一个非空白字符前面的空白字符(空格符和横向制表符)*/
- void ltrim(char *str) {
- int i = 0, j, len = strlen(str);
- while (str[i] != '/0') {
- if (str[i] != 32 && str[i] != 9)break; /*32:空格,9:横向制表符*/
- i++;
- }
- if (i != 0)
- for (j = 0; j <= len - i; j++) {
- str[j] = str[j + i]; /*将后面的字符顺势前移,补充删掉的空白位置*/
- }
- }
- /*删除str最后一个非空白字符后面的所有空白字符(空格符和横向制表符)*/
- void rtrim(char *str) {
- char *p = str;
- int i = strlen(str) - 1;
- while (i >= 0) {
- if (p[i] != 32 && p[i] != 9)break;
- i--;
- }
- str[++i] = '/0';
- }
- /*删除str两端的空白字符*/
- void trim(char *str) {
- ltrim(str);
- rtrim(str);
- }
- //这是libcurl接收数据的回调函数,相当于recv的死循环
- //其中stream可以自定义数据类型,这里我传入的是文件保存路径
- static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
- int len = size * nmemb;
- int written = len;
- FILE *fp = NULL;
- if (access((char*) stream, 0) == -1) {
- fp = fopen((char*) stream, "wb");
- } else {
- fp = fopen((char*) stream, "ab");
- }
- if (fp) {
- fwrite(ptr, size, nmemb, fp);
- }
- // printf("%s\n",ptr);
- fclose(fp);
- return written;
- }
- //加上-lcurl库
- void test_post(char* url,char* data) {
- CURL *curl;
- CURLcode res;
- curl = curl_easy_init();
- if (curl) {
- //www.baidu.com/#wd=java
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_POST, 1L);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
- res = curl_easy_perform(curl);
- curl_easy_cleanup(curl);
- }
- }
- int file_exists(char *filename) {
- return (access(filename, 0) == 0);
- }
- int GetCharset(char *src_html,char *charCode) {
- char tmp_html[HTML_BUFFER_SIZE]={0};
- int pos = indexOf(src_html, "text/html; charset=");
- if (pos > 0) {
- strncpy(tmp_html, src_html + pos + strlen("text/html; charset="), strlen(src_html) - pos);
- pos = indexOf(tmp_html, "\"");
- if (pos > 0) {
- strncpy(charCode, tmp_html, pos);
- }
- }
- return 0;
- }
- void test_get(char* url) {
- CURL *curl;
- CURLcode res;
- curl = curl_easy_init();
- if (curl) {
- if (file_exists(TMP_FILE))
- remove(TMP_FILE);
- curl_easy_setopt(curl, CURLOPT_URL, url);
- //指定回调函数
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
- //这个变量可作为接收或传递数据的作用
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, TMP_FILE);
- res = curl_easy_perform(curl);
- char tocode[64] = "UTF-8";
- if (CURLE_OK == res) {
- char *ct;
- res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
- if ((CURLE_OK == res) && ct)
- printf("We received Content-Type: %s\n", ct);
- //printf("====\n");
- //int pos=strcspn(ct,"UTF-8");
- int index = indexOf(ct, "=");
- char* arr[3];
- if (index > 0) {
- split(arr, ct, "=");
- //printf("%s\n", arr[1]);
- strcpy(tocode, arr[1]);
- }
- FILE *fp = NULL;
- fp = fopen(TMP_FILE, "r");
- char src_html[HTML_BUFFER_SIZE]={0};
- char output_html[HTML_BUFFER_SIZE]={0};
- char tmp_html[HTML_BUFFER_SIZE]={0};
- if (fp) {
- fread(src_html, HTML_BUFFER_SIZE, 1, fp);
- strcpy(tmp_html,src_html);
- if(index <0) {
- GetCharset(tmp_html,tocode);
- printf("%s\n",tocode);
- }
- int iRet;
- //打开字符集转换
- iconv_t hIconv = iconv_open(tocode,"iso-8859-1");
- if (-1 == (int) hIconv) {
- return -1; //打开失败,可能不支持的字符集
- }
- printf("%s\n",src_html);
- //开始转换
- iRet = iconv(hIconv, (char**) (&src_html), strlen(src_html), (char**) (&output_html), strlen(src_html));
- printf("%s\n", output_html);
- printf("ok");
- if(strcmp(output_html,"")==0)
- {
- printf("%s\n",src_html);
- }
- //关闭字符集转换
- iconv_close(hIconv);
- }
- }
- curl_easy_cleanup(curl);
- }
- }
- int main(int argc, char* argv) {
- //printf("%s\n",argv[1]);
- //http://192.168.1.6:8080/TestServer/index.html?fdasf=123456&af=89
- test_post("http://192.168.1.6:8080/TestServer/index.html","wd=hava&hehe=123456");
- //test_get("http://www.baidu.com/");
- printf("\nok");
- return 0;
- }
c语言libcurl 使用实例get/post方法+c语言字符串处理的更多相关文章
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- UML标准建模语言与应用实例
一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...
- (转)Objective-C语言--属性和实例变量
本文转自http://blog.csdn.net/addychen/article/details/39525681 使用Objective-C一段时间了,一直没有弄清楚在Objective-C中属性 ...
- Eclipse 官方简体中文语言包下载地址及安装方法
Eclipse 官方简体中文语言包下载地址及安装方法 打开Eclipse Babel Project 主页: http://www.eclipse.org/babel/downloads.php 根据 ...
- C语言的几种取整方法
C语言的几种取整方法 来源:http://blog.sina.com.cn/s/blog_4c0cb1c001013ha9.html 1.直接赋值给整数变量.如: int i = 2.5; 或 i = ...
- jQuery实例属性和方法
jQuery.fn = jQuery.prototype = { //添加实例属性和方法 jquery : 版本 constructor : 修正指向问题 init() : 初始化和参数 ...
- Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs
ylbtech-Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs 1.返回顶部 1. Java 实例 - 重载(ove ...
- java 反射机制之 getDeclaredMethod()获取方法,然后invoke执行实例对应的方法
关于反射中getDeclaredMethod().invoke()的学习,来源于项目中的一行代码: SubjectService.class.getDeclaredMethod(autoMatchCo ...
- “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法
“标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> 接口或 IQueryable& ...
随机推荐
- Python成长之路第一篇(4)_if,for,while条件语句
有了以上的基本基础,已经上面写的几个小练习,大家肯定有很多的不满,比如查询为什么查询一次就退出了呢?下面我们来学习条件语句 一.万恶的加号 以前我们在print的时候如果要加上变量都有是使用+来作为连 ...
- pycharm的激活
——————转———— Pycharm5注册方式 0x1 ,安装 0x2 , 调整时间到2038年. 0x3 ,申请30天试用 0x4, 退出pycharm 0x5, 时间调整回来. ##注册方法 ...
- 什么是web标准
Web Standards Standards是个复数,就知道他是有好几个标准或者规范组成的,分别是:结构规范 XML ,XHTML;表现规范 CSS;行为规范 DOM,ECMAScript; 上面是 ...
- C语言入门(19)——C语言的编码风格
代码风格好不好就像字写得好不好看一样,如果一个公司招聘秘书,肯定不要字写得难看的,同理,代码风格糟糕的程序员肯定也是不称职的.虽然编译器不会挑剔难看的代码,照样能编译通过,但是和你一个团队进行协作的其 ...
- C++多字节字符转换为宽字符的两种方法
目前知道有两种方式:可以提供宽字符与ANSI字符之间的转换, 第一种由COM库提供的函数 char* _com_util::ConvertBSTRToString(BSTR ); BSTR _com ...
- Struts2 一、 视图转发跳转
<struts> <constant name="struts.118n.encoding" value="UTF-8"></co ...
- 04737_C++程序设计_第2章_从结构到类的演变
例2.1 使用成员函数的实例. #define _SCL_SECURE_NO_WARNINGS #include <iostream> using namespace std; struc ...
- visibleViewController和topViewController 获取当前显示的页面
原文:http://blog.sina.com.cn/s/blog_881ed8500102vo38.html UINavigationController 中有visibleViewControll ...
- 垃圾回收算法简单介绍——JVM读书笔记<二>
垃圾回收的过程主要包含两部分:找出已死去的对象.移除已死去的对象. 确定哪些对象存活有两种方式:引用计数算法.可达性分析算法. 方案一:引用计数算法 给对象中加入一个引用计数器.每当有一个地方引用它时 ...
- [ACM] hdu 2191 珍惜如今,感恩生活 (多重背包)
Problem Description 急!灾区的食物依旧短缺! 为了拯救灾区同胞的生命,心系灾区同胞的你准备自己採购一些粮食支援灾区,如今如果你一共同拥有资金n元,而市场有m种大米,每种大米都是袋装 ...