VS2008 C++中 inet_addr()inetaddr函数的实现用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”

4815人阅读
今天在使用vs2008+MFC时候,使用editControl的replacesel(“”)发生报错。
如下::不能将参数1从“const char []”转换为“LPCTSTR”
其解决方案就是, 在项目属性里面找到项目默认值下面的字符集, 将其换为:使用多字节字符集就ok了。
typedef LPCTSTR LPTSTR ;
#ifndef _UNICODE
typedef TCHAR
typedef TCHAR wchar_t;
typedef LPTSTR const TCHAR*;
看到一篇很好的讲字符集(charset)转载过来。。感谢freebot楼主。
LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别
1、ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式。ANSI表示英文字母时就和
ASCII一样,但表示其他文字时就需要用多字节。
2、Unicode:用两个字节表示一个字符的编码方式。比如字符'A'在ASCII下面用一个字节表示,而在
Unicode下面用两个字节表示,其中高字节用“0”填充;函数'程'在ASCII下面用两个字节表示,而在
Unicode下面也是用两个字节表示。Unicode的用处就是定长表示世界文字,据统计,用两个字节可以编码
现存的所有文字而没有二义。
3、Windows下的程序设计可以支持ANSI和Unicode两种编码方法的字符串,具体使用哪种就要看定义了
MBCS宏还是Unicode宏。MBCS宏对应的字符串指针为LPSTR(即char*),Unicode对应的指针为
LPWSTR(即unsigned char*)。为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示char*,
在Unicode下它表示unsigned char*,这就可以重定义一个宏进行不同字符集的转换了。
LPSTR:指向一个字符串的32位指针,每个字符占1个字节。
LPCSTR:指向一个常量字符串的32位指针,每个字符占1个字节。
LPTSTR:指向一个字符串的32位指针,每个字符可能占1个字节或2个字节。
LPCTSTR:指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。
5、Windows使用两种字符集ANSI和Unicode,前者在处理英文字符时使用单字节方式,在处理中文字符时
使用双字节方式。后者不管是英文字符还是中文字符都是采用双字节方式表示。Windows NT的所有与字符
有关的函数都提供了两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字符常量相关,如_T(&你
好!&);。如果编码方式为ANSI,_T不起任何作用;如果编码方式为Unicode,编译器会把&你好!&以
Unicode方式进行保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以Unicode方法保存。
6、L表示字符串资源采用Unicode编码方式,示例如下:
wchar_t Str[]=L&Hello World!&; //每个字符都用2个字节来存储
7、_T是一个适配宏。当定义了_UNICODE时,_T和L相同;否则,_T的字符串采用ANSI编码方式。示例如
LPTSTR lptStr=new TCHAR[32];
TCHAR* szBuf=_T(&Hello&);
以上两个语句,无论是在ANSI编码方式,还是在Unicode编码方式下都是正确的。
8、微软推荐使用相匹配的字符串函数。例如,在处理LPTSTR或LPCTSTR的时候,应该使用_tcslen来替
代strlen函数。否则,在Unicode编码方式下,strlen不能处理wchar_t*的字符串。
9、T是一个非常重要的符号(TCHAR、LPTSTR、LPCTSTR、_T()和_TEXT()等),它表示使用一个中间
类型,既不明确表示使用MBCS,也不明确表示使用Unicode。到底使用哪种字符集,在编译的时候才决
10、CString类型到LPTSTR类型的转换
CString path1;
LPTSTR path2=path1.GetBuffer(path1.GetLenght());
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:95818次
积分:1125
积分:1125
排名:千里之外
原创:10篇
转载:55篇
(1)(4)(3)(2)(5)(1)(1)(3)(41)(4)inet_addr函数的实现
我的图书馆
inet_addr函数的实现
输入是点分的IP地址格式(如A.B.C.D)的字符串,从该字符串中提取出每一部分,转换为ULONG,假设得到4个ULONG型的A,B,C,D,ulAddress(ULONG型)是转换后的结果,ulAddress = D&&24 + C&&16 + B&&8 + A(网络字节序),即inet_addr(const char *)的返回结果另外,我们也可以得到把该IP转换为主机序的结果,转换方法一样A&&24 + B&&16 + C&&8 + D
-------------------------------------------------------
inet_addr函数处理IP地址需要注意的问题日 星期四 上午 08:40现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有 必要用手工计算它们,也没有必要用"&&"操作来储存成长整字型。
首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址"132.241.5.10" 要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:ina.sin_addr.s_addr = inet_addr("132.241.5.10");注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。 显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符 号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:&printf("%s",inet_ntoa(ina.sin_addr));它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:char *a1, *a2;..a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */printf("address 1: %s ",a1);printf("address 2: %s ",a2);输出如下:address 1: 132.241.5.10address 2: 132.241.5.10假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指针。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(15397)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Linux网络编程----IP转换函数--inet_addr和inet_ntoa',
blogAbstract:'
Linux下IP转换工具::
#Include &sys/types.h&
#include &sys/socket.h&
#include &arpa/inet.h&
strcut sockaddr_in&&
src.sin_addr.s_addr&& =& inet_addr(\"*.*.*.*\");&&&&&&&&&&&&&&&& //构建网络地址。
printf(\"%s\\n\",inet_ntoa(src.sin_addr));',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}4336人阅读
&1.CStringA m_ServerIP(m_ServerIP);//VS2008 Unicode CString 转 const char *
&//服务器地址信息&SOCKADDR_IN addrS&addrSock.sin_addr.S_un.S_addr=inet_addr(m_ServerIP);&addrSock.sin_family=AF_INET;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &2.addrSock.sin_port=htons(_ttoi(m_ServerPort));
其中红色字体m_ServerIP和m_ServerPort为CString类型。利用CStingA 和_ttoi分别转换为const char* 和int型
3.CString 与 void *类型转换
(1)CString 转换成 void *
p = (void*)str.GetBuffer(str.GetLength());
(2)void * 转换成CString
str.format("%S",(char*)p);
&4.CString转换为LPWSTR
CSLPWSTR pstr = (LPWSTR)(LPCWSTR)
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:417447次
积分:4335
积分:4335
排名:第6295名
原创:69篇
转载:32篇
评论:69条
(1)(4)(2)(3)(2)(1)(1)(2)(2)(1)(7)(6)(1)(1)(3)(1)(2)(10)(3)(3)(3)(4)(2)(2)(6)(2)(1)(8)(13)(6)

我要回帖

更多关于 linux inet addr 的文章

 

随机推荐