首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一个有关问题,请朋友们支招

2013-03-27 
求助一个问题,请朋友们支招本帖最后由 jetvf 于 2012-01-01 21:20:40 编辑#include windows.h #include

求助一个问题,请朋友们支招
本帖最后由 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' 退出循环
    

热点排行