https://dojang.io/mod/page/view.php?id=770
wchar_t 사용하기 파트에 있는 코드를 그대로 복사해서 실행해 봤는데 에러가 발생합니다.
실행 환경은 Windows 10 + gcc 7.3.0입니다.
main.c: In function 'main':
main.c:30:11: error: too many arguments to function 'wcstok'
ptr = wcstok(ws3, L" ", &next); // next?먮뒗 ?ㅼ쓬踰덉뿉 ?먮? 臾몄옄?댁쓽 ?ъ씤?곌? ?ㅼ뼱媛?
^~~~~~
In file included from main.c:2:0:
C:/msys2/mingw64/x86_64-w64-mingw32/include/wchar.h:1320:20: note: declared here
wchar_t *__cdecl wcstok(wchar_t * __restrict__ _Str,const wchar_t * __restrict__ _Delim) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
^~~~~~
main.c:34:15: error: too many arguments to function 'wcstok'
ptr = wcstok(NULL, L" ", &next);
^~~~~~
In file included from main.c:2:0:
C:/msys2/mingw64/x86_64-w64-mingw32/include/wchar.h:1320:20: note: declared here
wchar_t *__cdecl wcstok(wchar_t * __restrict__ _Str,const wchar_t * __restrict__ _Delim) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
^~~~~~
wcstok 부분에서 에러가 나는데 어떻게 해야 할까요...
첫 번째 예제는 Visual Studio에서만 쓸 수 있습니다.
두 번째 예제는 리눅스 + GCC에서 잘 동작합니다.
root@coffee:/mnt/e/works/c# gcc -Wall wchar2.c -o wchar2
root@coffee:/mnt/e/works/c# ./wchar2
13
Hello, world!123
Hello, world!123
0
o, world!123
ld!123
world!123
The
Little
Prince
root@coffee:/mnt/e/works/c#
단, 본문의 설명대로 %s -> %S로 바꿔야 리눅스 환경에서 제대로 동작합니다.
MinGW나 wchar_t 지원이 포함되지 않게 설정된 MinGW를 이용하는 중일 수도 있습니다.
또한, 비슷한 오류에 대해 다음과 같은 설명을 찾을 수 있었습니다.
GCC (mingw) has custom code to disable the checks for the wide printf
functions on Windows
리눅스 환경에서 gcc로는 위와 같이 잘 컴파일됩니다.
IBM에서 제공하는 문서와 예제로 테스트해보세요.
https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/wcstok.htm
윈도 환경에서는 Visual Studio를 사용하고, 리눅스 환경에서는 GCC/Clang을 사용하는 것이 좋습니다. 가능하면 네이티브 환경을 사용하세요. C 언어는 플랫폼 + 컴파일러 구현체에 따라 동작이 다른 경우가 많습니다.(대다수는 Undefined Behavior(정의되지 않은 동작)으로 명시되어 있습니다)