如何筛选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);
}
答
你一个普通的字符串做同样的方式:
/*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
的函数。
宽字符串文字需要“L”前缀,“L”这样的“'”。 – 2013-04-25 07:52:26
哎呀,对不起,我实际上是在我原来的代码中,但仍然无法正常工作。 – ChaseTheSun 2013-04-25 07:53:55
你的循环似乎也没有任何意义。 'j'的意义是什么?为什么你总是复制整个字符串尾部,而不是一个字符? – 2013-04-25 07:57:48