解决方案 »
- 关于在VS2012插入一个位图资源的问题
- mfc中如何使得列表视图中的每一行都能像树形结构一样展开
- 求助 Cximage 封装成dll 后 ,如何 使用的问题 (fandh请进)
- 关于读写XML
- 为什么用DWORD 取代unsigned long?
- 在线等待!谁能告诉我串口通讯中关于端口的地址?
- 花屏问题
- 请问何处(网上书店或北京某书店)能够以低价买到《MFC与Windows编程-第2版》即"Programming Windows with MFC 2/e"的影印版这一书?
- 请问,怎么在程序中关闭电脑,或者重新启动?参数是什么?[
- 哪里需要程序员???
- 关于Windows Media Player控件的问题
- 客户端多次发数据,服务器接数据后操作出现多线程问题
然后计算a里面有多少个Tchar长度??
应该是这么说。。
没天赋不要紧。多看实例多看书。不懂就问。我也新手学习ing.
for(TCHAR *s=a;*s;s+=_tcslen(s)+1):
s初始为a[0]的地址
*s是指s所指向的字符串不为空
s+=_tcslen(s)+1:因为GetLogicalDriveStrings()函数得到的字符串为磁盘加冒号加斜杆再加一个空字符(如C:\(NULL)D:\(NULL)E:\(NULL)(NULL))后面再跟上这种格式的其它磁盘路径,所以_tcslen(s)不算空字符(NULL)长度,C:\共三个字符,所以_tcslen(s)等于3再加上1跳过空字符指向下一个磁盘驱动字串
DWORD len=GetLogicalDriveStrings(sizeof(a)/sizeof(TCHAR),a); //unsigned long
GetLogicalDriveStrings的功能是返回一个字串,包含了当前所有逻辑驱动器的根驱动器路径. 至于字符串长度是多少,就是第一个参数传进去的值.用数组a的总大小除以一个TCHAR大小 得到的是a能够放的TCHAR个数.因为GetLogicalDriveStrings实际上是一个宏,在ASCII情况下是GetLogicalDriveStringsA,Unicode是GetLogicalDriveStringsW.其中返回的字符属于TCHAR类型,实际上也是一个宏 大小会随着你用ASCII是1个字节Unicode2个字节,也就是说如果在ascii下a可以存放255个字符Unicode下127个字符.所以这么做可以动态算出来a[256]到底能放多少字符.
for(TCHAR *s=a;*s;s+=_tcslen(s)+1)//unsigned short
{
cout<<s<<"\t\t"<<DispDriveType(GetDriveType(s))<<endl;
}
是这样的,
*s = a是for初始化的地方,指的是把*s指向a数组开头的那个字符.
*s为判断条件.当s指向的地方不为0,也就是还没到'\0'的时候那么继续循环
s+=_tcslen(s)+1指的是跳转到下一个字符串开头的地方,有点难解释 这是和GetLogicalDriveStrings配套用的
举个例子 GetLogicalDriveStrings假设返回的字符串如下:"C:\0D:\0E\0\0\0\0\0...."最后\0填充的大小应该
和你填进去的sizeof(a)/sizeof(TCHAR)有关那么当*s = a时 s指向的字符串是"C:"因为看到\0就认为字符串结束了
开始循环
1:*s = 'C' -> 执行循环体 -> _tcslen(s) 相当于 _tcslen("C:")等于2, +1=3 -> s+=_tcslen(s)+1 s指向"D:"
2:*s = 'D' -> 执行循环体 -> _tcslen(s) 相当于 _tcslen("D:")等于2, +1=3 -> s+=_tcslen(s)+1 s指向"E:"
3:*s = 'E' -> 执行循环体 -> _tcslen(s) 相当于 _tcslen("E:")等于2, +1=3 -> s+=_tcslen(s)+1 s指向"\0"
4:*s = '\0' 退出循环
2. 参考MSDN对GetLogicalDriveStrings函数的解释
您好,
由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。
若是觉得答案不嘉,请放在本版的疑难杂症帖链接:
http://bbs.csdn.net/topics/390351579。
如果您有什么意见,请您联系我。