나는 보통
라고 매크로로 사용하는데… 이거 어째서 std에서 정의 안해놓은거지? 내가 못찾은 건가.
나는 보통
라고 매크로로 사용하는데… 이거 어째서 std에서 정의 안해놓은거지? 내가 못찾은 건가.
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) 에서 발생했음.
…쩝 STL 오류코드 보느라 눈깔빠지는 줄 알았는데..
transform( s1.begin(), s1.end(), s1.begin(), tolower );
이 코드의 경우 VC 에서는 문제없이 돌아가는데 gcc에서는 toupper 인자, 리턴형 문제때문인지
이딴 썩을 에러코드를 뺃으면서 컴파일이 안된다.
해결방법은
transform( s1.begin(), s1.end(), s1.begin(), (int(*)(int))tolower );
로 수정. 즉 toupper 의 인자와 리턴형을 명시적으로 int형으로 수정해준것이다. 소스코드를 봐봐야 알겠지만 위에서 언급한 컴파일러의 빌트인 펑션 touuper 변수와 리턴형이 아마도 char로 되어있는게 아닌가 싶다.
(…엇…char로 되어있어야 더 잘되야 되는거 아냐?!
…귀찮다…)
냠…어쨋든 메모메모.
ps. 저렇게 해놓는게 올바른 방법인지는 모르겠다.
[CODE]
#include <iostream>
#include <algorithm>
#include <string>
using std::cout;
using std::endl;
using std::string;
using std::transform;
int main()
{
string s = “Yoway Bahamut Lagoona”;
transform( s.begin(), s.end(), s.begin(), toupper );
cout<<s<<endl;
}
[/CODE]
초간단해 뵈지만 저 내용을 찾는데 무려 1시간이 걸렸다 -_-;;
일단 msdn 이나 그런곳에서 찾으면 locale 이란 객체를 사용해서 영문자뿐이아니라 불어,독어 등등의 문자변화예제가 나오는데 토나오게 복잡하다.
[CODE]
#include <locale>
#include <iostream>
using namespace std;
int main( )
{
locale loc1 ( “German_Germany” );
char *string = “HELLO, MY NAME IS John!”;
use_facet<ctype<char> > ( loc1 ).tolower
( &string[0], &string[strlen(&string[0])-1] );
cout << “The lowercase string is: ” << string << endl;
}
[/CODE]
이게 msdn 에 나온 예제… 뭐 자세히 보면 그리 복잡해뵈지도 않지만…문제는 비주얼스튜디오 2002에서 기본적으로 컴파일해서 실행시키면 런타임 오류가 난다. 컴파일 옵션 /EHsc 를 주라고 하는데… 얼마나 찝찝한가! 안그래도 UNIX 포팅때문에 CString 을 없에고 있는 마당인데 뭔가 컴파일 설정 들어가고 그러는 코드를 짜놓으면 후회할것 같다.
locale 에 관련된 내용도 좀 찾아보고 사용해야 되고..
에휴…어쨋거나 메모. STL 사용의 길은 멀고 험하다..
ps. 나중에 locale 관련 참고할 url (http://turboc.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_tip&no=16)
std::string 을 쓸때 CString 에서 처럼 Format(“%d”, 100 ) 이런 코드를 작성하지 못해서 좀 난감해 하고 있었는데
[CODE]cout<<100<<“하하”<<endl;[/CODE]
이런 코드를 생각해 볼때
iostream 쪽을 상속받아서 위의 sprintf 같이 문자열을 생성해내는 클래스가 분명히 있을거라 생각해서 이것저것 뒤져보니 stringstream 이라는 클래스가 있었다.
예제 코드는
[CODE]
#include <iostream>
#include <string>
#include <sstream>
using std::string;
using std::cout;
using std::endl;
using std::ostream;
using std::stringstream;
int main()
{
int interger = 10;
double doublevalue = 213.33;
string tmp = “yoway”;
string str;
stringstream stream(stringstream::in | stringstream::out);
stream<<interger<<“, “<<doublevalue<<“, “<<tmp;
str = stream.str();
cout<<str<<endl;
return 0;
}
[/CODE]
아마 cout 쓸때 서식지정하는 방법과 동일하게 stringstream 도 사용할수 있을듯…