2013-04-25 76 views
0

给出:如何筛选wchar_t数组?

wchar_t filter_chars[] = L".+,?=&"; 
wchar_t haystack[] = L"words+punctuation&special_chars?"; 

期望的结果:

wordspunctuationspecialchars 

我如何从一个给定的(Unicode)的字符串中删除特殊字符?

我使用的Win32 C(没有C++)

这里是我的尝试:

void filter(wchar_t str[]) { 

    wchar_t buf[80]; 
    ZeroMemory(buf, 80); 

    UINT i, j; 

    for(i = j = 0; i < wcslen(str); i++) { 
     if (!wcschr(filter_chars, str[i])) { 
      wcscpy((wchar_t*)buf[j], (wchar_t*)str[i]); 
     } 
    } 

    wcscpy(str, buf); 
} 
+0

宽字符串文字需要“L”前缀,“L”这样的“'”。 – 2013-04-25 07:52:26

+0

哎呀,对不起,我实际上是在我原来的代码中,但仍然无法正常工作。 – ChaseTheSun 2013-04-25 07:53:55

+0

你的循环似乎也没有任何意义。 'j'的意义是什么?为什么你总是复制整个字符串尾部,而不是一个字符? – 2013-04-25 07:57:48

回答

2

你一个普通的字符串做同样的方式:

/*dest must be at least strlen(src) wide*/ 
wchar_t *filter(wchar_t dest[], wchar_t const src[], wchar_t const filter_chars[]) 
{ 
    size_t iSrc=0, iDest=0; 
    for(iSrc=0 ; src[iSrc] != L'\0' ; ++iSrc) 
    { 
     if(NULL == wcschr(filter_chars, src[iSrc])) 
      dest[iDest++] = src[iSrc]; 
    } 
    dest[iDest] = L'\0'; 
    return dest; 
} 

您还可以为dest添加指定缓冲区大小的版本。我不记得标准中的别名是如何工作的,因此您可能会或可能不会“合法地”调用dest等于src的函数。

+1

你错过了'return'。 – unwind 2013-04-25 08:24:24

+0

@unwind谢谢,纠正。 – Medinoc 2013-04-25 08:27:41