本帖最后由 jetvf 于 2012-01-01 21:20:40 编辑

解决方案 »

  1.   

    sizeof计算长度的。就是a的长度除以 Tchar 的长度  
    然后计算a里面有多少个Tchar长度??
    应该是这么说。。
    没天赋不要紧。多看实例多看书。不懂就问。我也新手学习ing.
      

  2.   

    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跳过空字符指向下一个磁盘驱动字串
      

  3.   


     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' 退出循环
        
      

  4.   

    1. 第一个计算数组的大小
    2. 参考MSDN对GetLogicalDriveStrings函数的解释
      

  5.   


    您好,
    由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。
    若是觉得答案不嘉,请放在本版的疑难杂症帖链接:
    http://bbs.csdn.net/topics/390351579。
    如果您有什么意见,请您联系我。