为了完成作业,就偷个懒糊了个获取手机归属地的程序,。我原本写的是MFC版本的,但是由于MFC的代码不是很通用,加上我没有学MFC的时候看别人MFC代码只能干瞪眼,看不懂,所以便改成控制台版本的了。但这API还害得我找了老半天,不是功能少就是根本用不了(例如youdao)文中所用的API地址是 http://api.showji.com/Locating/www.showji.co.m.aspx,有两个参数:

m 手机号,由11位数字组成 
output 可以为xml或json

注:浏览器显示可能有些问题,毕竟<Mobile>等标签浏览器是无法识别的,可以在“查看源文件”中查看

我使用的是xml格式。json解析可以用jsoncpp,就是不知道怎么在VC6下使用,若您了解,还请你回复讲解。

思路很简单,URLDownLoadToFile()下载文件,再写个函数解析,好,开始!

// 头文件
#include <stdio.h>
#include <windows.h>
#include <urlmon.h>
#pragma comment( lib, "urlmon.lib" )
 // 为了复制粘贴方便,写了2个宏
#define GETEND( str ) (SreachStr( MobileInfo, str ) + strlen( str ))
#define GETSTART( str ) (SreachStr( MobileInfo, str ) - 1)
 // 函数Utf8_to_ascii,API大多都是UTF8格式的,要用此函数转换成ascii
char *Utf8_to_ascii( char utf8[] )
{
int len = MultiByteToWideChar( CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t *wstr = new wchar_t[len+1];
memset( wstr, 0, len + 1);
MultiByteToWideChar( CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte( CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char *str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if( wstr )
{
delete[] wstr;
}
return str;
}
 // 函数SreachStr,寻找API中间<...>...</...>的数据
int SreachStr( const char str1[], const char str2[] )
{
int i = 0;
int j = 0;
int len1 = strlen( str1 );
int len2 = strlen( str2 );
for( i = 0; i < len1; i++ )
{
bool Findit = true;
for( j = i; j < len2 + i; j++ )
{
if( str2[j-i] != str1[j] )
{
Findit = false;
}
}
if( Findit )
{
return i;
}
}
return -1;
}
    主函数似乎太长了点……
int main( int argc, char *argv[] )
{
char Mobilenum[11];
HRESULT hDownToFile; // 文件下载句柄
HANDLE hMobileFile; // 手机信息句柄
char chUrl[100];
unsigned long nReadSize = 0;
memset( Mobilenum, 0, 11 );
memset( chUrl, 0, 100 );
scanf( "%s", Mobilenum ); strcpy( chUrl, "http://api.showji.com/Locating/www.showji.co.m.aspx?m=");
strcat( chUrl, Mobilenum );
strcat( chUrl, "&output=xml" );
hDownToFile = URLDownloadToFile( 0, chUrl, TEXT("Temp File.tmp"), NULL, NULL );
if( hDownToFile != S_OK )
{
printf( "下载失败!\n" );
return 0;
}
hMobileFile = CreateFile( "Temp File.tmp", // 文件名
GENERIC_READ, // 读文件操作
NULL,
NULL,
OPEN_EXISTING, // 打开文件
FILE_FLAG_DELETE_ON_CLOSE, // 作为临时文件
NULL);
if ( hMobileFile == INVALID_HANDLE_VALUE )
{
printf( "打开文件失败!\n" );
return 0;
}
char ReadData_UTF8[400];
char MobileInfo[400];
memset( ReadData_UTF8, 0, 400);
if ( ReadFile( hMobileFile, ReadData_UTF8, 400, &nReadSize, NULL ) == FALSE )
{
printf( "读取文件失败!\n%d", GetLastError() );
return 0;
}
strcpy( MobileInfo, Utf8_to_ascii(ReadData_UTF8) );
CloseHandle( hMobileFile );
/************************** 读取工作结束 *************************/
/************************** 开始解析数据 *************************/
char temp[30];
int i = 0;
int start = GETEND( "<QueryResult>" );
int end = GETSTART( "</QueryResult>" );
memset( temp, 0, 30);
for( i = start; i <= end; i ++ )
{
temp[i - start] = MobileInfo[i];
}
if( !strcmp( temp, "False") )
{
printf( "号码不存在或暂无数据!\n" );
return 0;
}
start = GETEND( "<City>" );
end = GETSTART( "</City>" );
memset( temp, 0, 30);
for( i = start; i <= end; i ++ )
{
temp[i - start] = MobileInfo[i];
}
printf( "所 在 地: %s\n", temp );
start = GETEND( "<AreaCode>" );
end = GETSTART( "</AreaCode>" );
memset( temp, 0, 30);
for( i = start; i <= end; i ++ )
{
temp[i - start] = MobileInfo[i];
}
printf( "区 号: %s\n", temp );
start = GETEND( "<PostCode>" );
end = GETSTART( "</PostCode>" );
memset( temp, 0, 30);
for( i = start; i <= end; i ++ )
{
temp[i - start] = MobileInfo[i];
}
printf( "邮政编码: %s\n", temp );
start = GETEND( "<Corp>" );
end = GETSTART( "</Corp>" );
memset( temp, 0, 30);
for( i = start; i <= end; i ++ )
{
temp[i - start] = MobileInfo[i];
}
printf( "运 营 商: %s\n", temp );
start = GETEND( "<Province>" );
end = GETSTART( "</Province>" );
memset( temp, 0, 30);
for( i = start; i <= end; i ++ )
{
temp[i - start] = MobileInfo[i];
}
printf( "省 份: %s\n", temp );
return 0;
}
    总算完成了。运行界面如图:

源码下载地址:

[VC6 console]调用API获取手机归属地的更多相关文章

  1. 在C#中调用API获取网络信息和流量

    原文 在C#中调用API获取网络信息和流量 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量. ...

  2. [VB.NET]调用API获取/设置键盘按键状态

    1.调用GetAsyncKeyState()获取指定按键的状态,GetActiveKey()检索指定范围内的按键状态 2.调用keybd_event()可合成一次击键事件,通常两次击键事件间需要设定时 ...

  3. [VB.NET][C#]调用API获取或设置键盘按键状态

    前言 通过 C# 或 VB.NET,你只需编写少量的代码即可实现一个按键精灵. 第一节 接口 调用系统 API 实现获取或设置指定的按键状态. 获取按键状态 调用 GetAsyncKeyState() ...

  4. java 获取手机归属地,引起net.UnknownHostException错误

    这个问题是请求,重定向了,跟入源码.修改了地址,变成302 Connection connect = Jsoup.connect(url); connect.header("Host&quo ...

  5. android调用JPush获取手机的注册码(Cordova环境)

    JPushInterface.addLocalNotification(cordova.getActivity().getApplication().getApplicationContext(), ...

  6. JS 新浪API获取IP归属地

    http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 返回值数据格式:var remote_ip_info = {“ret”:1,” ...

  7. C++调用API获取当前时间

    #include <string> #include<iostream> #include<windows.h> #include <sstream> ...

  8. PHP通过Zabbix API获取服务器监控信息

    开源监控系统Zabbix提供了丰富的API,供第三方系统调用. 基本步骤如下: 1.获取合法认证:连接对应Zabbix URL,并提供用户名和密码,HTTP方法为"POST",HT ...

  9. 高德地图API获取天气

    1.建立行政区规划清单表 use edw; drop table if exists dim_prov_city_adcode; create table if not exists dim_prov ...

随机推荐

  1. 后缀数组的一些性质----height数组

    height数组:定义 height[i] = suffix[i-1] 和 suffix[i] 的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀.那么对于 j 和 k 不妨设 Rank[j] & ...

  2. QF——OC中的KVC,KVO

    KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性.KVC其实也是OC反射机制的一种运用. 之所以 ...

  3. javascript 数组的常用操作函数

    join() Array.join(/* optional */ separator) 将数组转换为字符串,可带一个参数 separator (分隔符,默认为“,”). 与之相反的一个方法是:Stri ...

  4. linux 下eclipse配置apache服务器,选中server时server name为灰色状态

    后来发现,没有创建

  5. javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记

    1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获 ...

  6. Could not lock surface java.lang.IllegalArgumentException

    08-07 14:46:33.795: E/Surface(4927): dequeueBuffer failed (Invalid argument) 08-07 14:46:33.800: E/V ...

  7. the C programming language 阅读笔记2

    1. 指针 1.1 自增符的使用 ++*p;//p指向的内容加一 (*p)++; //p指向的内容加一 *p++;//p本身自增 *++p; //p本身自增 因为诸如*和++这样的一元运算符在表达式求 ...

  8. (C)学生成绩管理系统

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h&g ...

  9. CentOS和Redhat发行版linux内核版本的对应关系

    由于Redhat和CentOS的发行版本现在众多,所以我们应该知道CentOS和Redhat及linux内核之间版本的对应关系对维护系统还是很有帮助的.对应的列表如下: Redhat 9.0————— ...

  10. 一款C++静态分析工具 —— CppDepend

    Wrote by mutouyun. (http://darkc.at/cppdepend/) 去年6月份的时候,CppDepend的一位技术社区经理(technical community mana ...