求助一个问题,请朋友们支招
本帖最后由 jetvf 于 2012-01-01 21:20:40 编辑
#include "windows.h"
#include "tchar.h"
#include "iostream.h"
char * DispDriveType(int n)
{
switch(n)//关于磁盘类型的定义,在 winbase.h 中定义
{
case 0://DRIVE_UNKNOWN
return "未知磁盘";
break;
case 1://DRIVE_NO_ROOT_DIR 无法找到根目录
return "磁盘不存在";
break;
case 2://DRIVE_REMOVABLE 可移动驱动器
return "可移动磁盘";
break;
case 3://DRIVE_FIXED 固定磁盘驱动器:本地硬盘或移动硬盘
return "本地磁盘";
break;
case 4://DRIVE_REMOTE
return "网络驱动器";
break;
case 5://DRIVE_CDROM
return "CD/DVD_ROM";
break;
case 6://DRIVE_RAMDISK
return "随机存取磁盘";
break;
}
}
void main()
{
TCHAR a[256]; //unsigned short
DWORD len=GetLogicalDriveStrings(sizeof(a)/sizeof(TCHAR),a); //unsigned long
cout<<"磁盘符号"<<"\t"<<"磁盘类型"<<endl;
for(TCHAR *s=a;*s;s+=_tcslen(s)+1)//unsigned short
{
cout<<s<<"\t\t"<<DispDriveType(GetDriveType(s))<<endl;
}
cin.get();
}
在上述代码,sizeof(a)/sizeof(TCHAR) 这个得出什么?我看的懵懵懂懂de。
for(TCHAR *s=a;*s;s+=_tcslen(s)+1) 这个for循环本来应该是很简单的,可是在这里看得也懵懵懂懂de
我很喜欢编程,但是没有天赋~顺便告诉我我该怎么办~
[解决办法]
sizeof计算长度的。就是a的长度除以 Tchar 的长度
然后计算a里面有多少个Tchar长度??
应该是这么说。。
没天赋不要紧。多看实例多看书。不懂就问。我也新手学习ing.
[解决办法]
for循环就是移动指针嘛。
[解决办法]
sizeof(a)/sizeof(TCHAR):a声明的是一个包含256个TCHAR类型字符的数组,所以相除还是256
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' 退出循环