C++의 wcout 과 wstring 에 대한 질문드립니다. (덧붙여 return?

ixevexi의 이미지

특수한 (한자를 사용해야하는) 프로그램인데요
당연히 wchar_t를 쓰기로 했습니다.

대략 코드는 다음과 같습니다.

 int main()
{
   wstring buffur = L"金延秀";
   
   wcout << buffur;
   wcout << buffur.c_str();
   wcout << buffur[1];

   wchar_t * name =L"김연수"

   wcout << name;

}

물론 맞는 헤더들도 다 넣어서 컴파일시 워닝하나 안뜹니다.
문제는 예상했던 출력값이 나오는게 아니라 그냥 아무것도 안나옵니다.

제가 무얼 잘못했는지 사실 잘 모르겠습니다. -_-;; 고수분들 도와주셔요

그리고 위에서 return 0;가 없는데 어케 워닝내지는 에러메시지가 안나오냐?
제말이 그말입니다. 감히 strong type인 C++이 return 0;를 빼먹다니!!!

int main()
{
//컴파일러가 정적변수들을 초기화하는 코드들...

//내코드들

//컴파일러가 정적변수 리소스를 해체하는 코드들...
}

위에서 굵게된 것들이 실제로는 컴파일시에 추가된다고 들었습니다.
그것때문에 return 값을 안써도 되게 표준이 변했는지 느무느무 궁금합니다.
갈쳐주세요..

byung82의 이미지

흠..
출력하실때 로케일 설정이 안되어서 안나오는것 아닐까요 ^^;

한번 로케일 설정을 해보세요

ixevexi의 이미지

로케일 설정된 xterm과
심지어는 윈도우xp!에서도 해보았습니다.

제가 알기론 xp는 유니코드/2바이트문자/를 완벽히 지원하는 걸로 알고 있는데

둘다 아무것도 안나옵니다. ㅠ.ㅜ

정녕 char로 노가다를 해야하는 것입니까.....

C++, 그리고 C++....
죽어도 C++

byung82의 이미지

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

std::locale::global( std::locale( "kor" ) ); //"UTF-8") );
std::cout << "Set locale to " << std::locale().name() << std::endl;

wstring buffur = L"金延秀";

wcout << buffur << endl;

wchar_t * name =L"김연수";

wcout << name;

return 0;
}

한글 로케일 설정하니 잘 찍힙니다 ^^:
Linux에서는 테스트 안해봤습니다.

아마 똑 같이 되지 않을가 싶습니다 ^^;

죠커의 이미지

전에 C++ 문제가 있길래 풀어보다가 문득 생각이 나서 wstring와 wcout을 써본 적이 있습니다. 아래와 같이 하니 결과가 나오더군요. 전에 테스트 해봤던 플랫폼은 win2000 + VC6입니다.

맘에 안드는 부분도 있지만 w_char 문제라면 참고해보세요 :-)

#include <iostream>
#include <string>
#include <locale>
#include <cstdlib>

using namespace std;

int main( void )
{ 
    wcin.imbue( locale( "korean" ) );
    wcout.imbue( locale( "korean" ) ); 

    const int bottom=0, top=100;
    int source;
    for( ;; )   // loop infinity
    {
        wcout << bottom << L"부터 " << top;
        wcout << L"까지의 자연수를 입력해주세요." << endl;
        wcin >> source;

        if( source>=bottom && source<=top )
            break;
        else
            wcout << L"입력형식이 잘못되었습니다. 다시 입력해주세요." << endl;
    }

    wstring unit( L"십백천만" );
    wstring num( L"일이삼사오육칠팔구" );
    wstring output;
    for( int i=source,j=-1 ;; i/=10,++j )    // no condition.
    {    
        if( j==-1 && ( i%10 != 0 ) )
            output = num.substr( ( i%10 )-1, 1 );
        else if( i%10 != 0 )
            output = num.substr( ( i%10 )-1, 1 )+unit.substr( j, 1 )+output;
        else if( source == 0)
            output = L"영";
        else
            ;   // do nothing;

        if( i < 10 )
            break;
    }

    wcout << output << endl;
    return EXIT_SUCCESS;
}

PS: 제가 예전에 테스트 해본결과로는 wstring에서 []를 쓰는 것은 안 좋아보입니다. 반환값이 short int등으로 나오니 (2byte코드를 한번에 출력할려고 하니 어쩔수 없겠지요.) 차라리 substr으로 문자열로 짤라내는 것이 좋더군요.

ixevexi의 이미지

답변 감사드립니다. ^^
C++에서도 로케일 설정을 해야하는군요

초보인지라 잘 몰랐습니다.
제가 본 책들에선 국제화에 관한 주제가 너무 부족한지라...
혹시 유니코드나 국제화에 관한 좋은 책이 있다면 추천을...

그리고 return을 안써도 되는 이유가 아직도 안나왔네요
궁금해 죽겠어요....

C++, 그리고 C++....
죽어도 C++

죠커의 이미지

ixevexi wrote:
답변 감사드립니다. ^^
C++에서도 로케일 설정을 해야하는군요

예전에 저도 삽질한 적이 있습니다. 로케일과 wstring의 []연산자. 생각하면 끔찍합니다. 간단한 거지만 한동안 삽질하게 만들었으니깐요.

ixevexi wrote:
초보인지라 잘 몰랐습니다.
제가 본 책들에선 국제화에 관한 주제가 너무 부족한지라...
혹시 유니코드나 국제화에 관한 좋은 책이 있다면 추천을...

국내에서 찾은 자료들은 실제로 안되는 경우가 많아서 저는 일본과 중국 자료들을 참고했습니다. 국제화에 대해서 중국보다도 쳐진다는 것에 서글펐었네요.

ixevexi wrote:
그리고 return을 안써도 되는 이유가 아직도 안나왔네요
궁금해 죽겠어요....

경고가 안나온 이유는 단순히 말하면 임플리멘테이션의 마음입니다. (main의 return이 없어도 허용하는지에 대해서는 살펴봐야겠네요.) 표준에서 main의 return을 반드시 허용하는지는 지금 포맷을 한 상태라서 pdf를 열수 없어서 확인이 안되지만...

경고나 에러에 대해서는 (..) 임플리멘테이션의 마음입니다. 쓸데없는 워닝과 에러도 뱉고 쓸만한 워닝과 에러를 안 뱉는 경우도 있지요.

IOKLO의 이미지

http://www.research.att.com/~bs/bs_faq2.html#void-main

에 가보시면..

Quote:

In C++ main() need not contain an explicit return statement. In that case, the value returned is 0, meaning successful execution.

라고 써있네요.. 안써도 되는가봅니다..

ixevexi의 이미지

답변 감사드립니다. :D

좋은 한 주일 시작하세요

C++, 그리고 C++....
죽어도 C++

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.