首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
c语言libcurl 使用实例get/post方法+c语言字符串处理
时间:
2014-12-21 21:55:56
阅读:
376
评论:
0
收藏:
0
[点我收藏+]
标签:
[cpp]
view plain
copy
#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语言字符串处理
标签:
原文地址:http://www.cnblogs.com/lidabo/p/4177016.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!