2013-04-25 5 views
0

주어진 : 내가 주어진 (유니 코드) 문자열에서 특수 문자를 제거 할 수있는 방법을wchar_t 배열을 필터링하는 방법은 무엇입니까?

wordspunctuationspecialchars 

:

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

은 결과를 원하는?

내가는 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"은 ""와 같습니다. –

+0

죄송합니다. 실제로 원래 코드에서 사용했지만 작동하지 않습니다. – ChaseTheSun

+0

루프도 의미가없는 것처럼 보입니다. 'j'의 요점은 무엇입니까? 그리고 왜 단 한 문자가 아닌 전체 문자열 꼬리를 항상 복사합니까? –

답변

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; 
} 

에 지정된 버퍼 크기가있는 버전을 추가 할 수도 있습니다. 표준에서 앨리어싱이 작동하는 방식을 기억하지 않으므로 destsrc과 같은이 함수를 "합법적으로"호출 할 수도 있고 그렇지 않을 수도 있습니다.

+1

당신은'return'을 놓치고 있습니다. – unwind

+0

@unwind 고마워요, 고쳤습니다. – Medinoc

관련 문제