如何从WCHAR数组中获取子字符串

时间:2013-07-10 05:29:36

标签: c++ string winapi wchar-t

我有一个WCHAR数组就像这样

WCHAR Path[256];

所以我在我的函数getpath(Path)中传递了这个数组,它正在填充路径中的值,如下所示:

//device/systemName/

所以我想从上面的字符串中只获取设备。

我的代码在这里:

   WCHAR *pDevName;

   int i = 0;
   int j = 0;

   while(Path[i] != NULL){ 
     if(0 ==(wcscmp(Path, L"/")))
     {

        //i = i + 2;
         ++i;
        continue;
    }

    else
    {
        pDevName[j] = Path[i];

        ++i;
        ++j;
        if (0 == wcscmp(Path, L"/")){
            break;
        }
    }

我的代码正在编译,但它不是从WCHAR数组返回给我的设备。它正在返回//devicename/systemName/,来自pDevName

我对wcscmp()的比较表示怀疑。所以我的问题是如何比较/与剩余的wchar数组值。

2 个答案:

答案 0 :(得分:1)

wcscmp比较字符串,而不是字符。您每次都将同一地址传递给wcscmp - Path,这意味着您所做的就是将整个字符串与" /"进行比较,这将永远失败。

如果要测试单个字符,可以直接比较其值,例如:

WCHAR *pDevName;
// NB: I assume you are allocating pDevName and just left that out of the code
// for brevity.
int i = 0;
int j = 0;

while(Path[i] != L'\0'){ 
 if(Path[i] == L'/')
 {
     ++i;
    continue;
 }
 else
 {
    // NB: you should check for overflow of pDevName here
    pDevName[j++] = Path[i++];
    if (Path[i] == L'/')
        break;
 }
}

答案 1 :(得分:1)

由于您指定了c ++,因此更容易做到这样的事情:

#include <string>

using namespace std;

wstring get_device_name(const wchar_t* path) 
{
    wstring source(path);
    wstring device_name;

    if (source.substr(0, 2)==L"//") 
    {
        size_t position= source.find(L'/', 2);

        if (position==wstring::npos) 
            device_name= source.substr(2);
        else
            device_name= source.substr(2, position-2);
    }

    return device_name;
}