태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

일반 C를 사용하여 Token을 하는 경우에는 그냥 strtok를 보통 사용하였습니다.

그러나 C++을 사용하게 될 때 구현하기 귀찮(?)아서 기존의 C 라이브러리 함수를 이용하게 되는데, 개인적으로

가장 자주 사용하는것이 strtok와 atoi입니다.

비주얼 스튜디오 2005 이후에서는 strtok를 이용하면 경고를 출력해줍니다.

이를 무시하고 코딩을 하는 경우가 많았는데........이를 무시하면 정말..무시무시한 디버깅의 세계로 빠져들 수 있으니 항상 조심하셔야합니다.


결론부터 말씀드리자면..strtok 함수는 비주얼 스튜디오 6.0 에서는 정상 작동하나, 그 이후 버전에서는

실행은 되지만 뒤에 쓰레기 값이 박히는 경우가 종종 발생합니다.

이를 대체하기 위해서 strtok_s를 이용하게 됩니다. 사용법은 아래 링크를 타고 가시면 됩니다.

출처 : http://harmonize84.tistory.com/112 

그런데 여기서 한가지 더 문제..strtok_s를 윈도우에서만 존재하는 함수라는 것입니다..

즉, 리눅스에서 같은 소스를 실행하면 에러가 난다는 것입니다.(물론 g++ 컴파일러 사용..)

그래서 다시 strtok로 변경하게 되면..쓰레기 값은 출력되지 않으나..자세히 보면 정상적인 출력이 아닌 경우가 발생합니다.

그래서 여기서 해결 방법은 strtok_r을 이용하는것입니다.

사용법은 man 페이지를 참고하세요 ~_~)~
예전에 map에서 key값이 아닌 value 값으로 정렬을 많이 했었는데, 항상 vector로 변환한 뒤에 sort 알고리즘을

사용했었습니다.

뭐, 이번에도 변함없이 map을 vector로 변한 한 뒤에 sort 알고리즘을 사용하여서 value로 정렬을 했습니다.

그런데..이게 무슨 일인가요..정렬알고리즘을 썼는데 정렬하지 않았을 때와 같은 내용이 파일에 써지는 것입니다!!

제 머리속이 살짝 복잡해서..이 당시에 생각했었던 알고리즘은 다음과 같습니다......멍청하게..ㅠ_ㅠ

1. map -> 변환 -> vector
2. vector - >sort
3. vector-> 변환 ->map (이게 무슨..개 풀 뜯어먹는 생각인지..)
4. 끝~

결과는 GG....이 걸로 30분을 고민했습니다.

"왜 안돼지..왜 안될까..왜 안될까.."

그러면서 1->2->3->4를 무한 반복해가면서 뭐가 잘못됐는지 계속 생각했습니다.

문득.....

1. map -> 변환 -> vector
2. vector - >sort
3. vector-> 변환 ->map (이게 무슨..개 풀 뜯어먹는 생각인지..)
제 스스로에게 : 지금 장난치냐?!?!?!?!?! 이게 왜 들어가..?!
4. 끝~

하...전 정말 바보인가 봅니다 ㅠ_ㅠ

vector<pair<int, string> > map_sort(map<string, int> &target)
{
    vector<pair<int, string> > vt;
    vector<pair<int, string> >::iterator it_vt;
    map<string, int>::iterator it_map;
    for(it_map  = target.begin(); it_map != target.end(); it_map++)
    {  
        vt.push_back(make_pair(it_map->second,it_map->first));
    }
    sort(vt.rbegin(),vt.rend());
    target.clear();
    /*
    for(it_vt = vt.begin(); it_vt < vt.end(); it_vt++)
    {
        cout<<it_vt->second<<"\t"<<it_vt->first<<endl;
        target[it_vt->second] = it_vt->first;
    }
    */
    return vt;    
}
저 빨간 부분이..바로..그....부분 입니다...하...눈물 나는군요 ㅠ_ㅠ
namespace....

솔직히 전에 듣기로는 그냥 타자 여러번 치기 힘드니까 쓰는 것이라고 이해했습니다.

물론 맞는 말이기도 한 것 같습니다 =_-;

그런데 오늘 www.winapi.co.kr(나의 절대적인 레퍼런스)에서 심심해서 강의를 보는 도중 namespace

에 대해서 나와있었습니다.

"오..그렇구나..오? 오~ 오!!!! 대박인데!!!"

라고 생각을 하며 아래와 같은 소스를 실험해 봤습니다.

namespace me
{
    int a;
    int b;
    void print();
    class Test
    {
       
    };
}
void me::print()
{
    cout<<"!!"<<endl;
}

int main()
{
    me::a = 10;
    me::Test d;
    cout<<me::a<<endl;
    me::print();
    return 0;
}

결론은 다 됩니다..

구조체든..클래스든..뭐든지 간에 다 들어가서 박힐 수가 있습니다.

순간 번뜩!! 하면 뇌리를 스친 것이 있는데.....

그렇다면...클래스끼리 묶어두면 좋지 않을까? 하는 생각이 들었습니다.

함수끼리 묶어서 클래스 만들 듯이 클래스끼리 묶어서 namespace 안에 넣어두는..

그래서 선배님께 여쭤보았더니

"원래 이렇게 쓰잖아~"

두둥....역시 선배님은 모르는게 없습니다 =ㅅ=;;;

대학교 4학년에 이제야 깨우친..namespace.......

도대체 이런 것들은 누구에게 배워야 하는지..ㅠ_ㅠ

아무튼..오늘도 뇌에 나노미터의 줄을 하나 더 그었군요 =ㅅ-)v
오늘 오전 내내 전처리 과정때문에 말썽을 좀 많이 피웠습니다..

그래서 좋은 자료 트랙백 해 놓습니다.

ANSI 표준에 따른 C의 전처리문의 종류
 - 파일 처리를 위한 전처리문 : #include
 - 형태 정의를 위한 전처리문 : #define, #undef
 - 조건 처리를 위한 전처리문 : #if, #ifdef, #ifndef, #else, #elif, #endif
 - 에러 처리를 위한 전처리문 : #error
 - 디버깅을 위한 전처리문 : #line 
- 컴파일 옵션 처리를 위한 전처리문 : #pragma

원래 가장 뒤에 연속된 개행문자만 지우려고 했는데 그게 잘 안되더군요..

그래서 스트링 a에서 뒤부터 개행 문자를 찾고(rfind)  찾은 곳으로 부터 char 하나를 지웠습니다.(erase)

그런데 그 뒤에 개행문자를 찾는 지점과 문자열 a의 사이즈를 찍어봤더니...

a 사이즈 : 200
개행문자 찾은 지점 : 200

(위의 과정을 하번 겪은 후에)
a 사이즈 : 199
개행문자 찾은 지점 : 198
(위의 과정을 한번 더 겪은 후에)
a사이즈 : 198
개행문자 찾은 지점:197
.
.
.
.
이게 도대체 뭐하자는 건가...싶어서 곰곰히 생각을 해봤는데

리눅스에서 개행문자는 \r이라는 것이 생각이 나더군요..

뭐 아무튼 각설하고 아래 주석 보시면서 윈도우에서 리눅스로 넘어가면서 스트링을 바로 처리하셔야 할 때는 참고하세요~

(dos2unix를 쓰면 안되나요? --> 해봤는데.. 안됩니다.....이유는 잘 모르겠습니다..아무튼..좀 호환성이..참....애매 하네요 -_-).......)

     8 void delete_newline(string &a)
     9 {
     10     while(1)
     11     {
     12         int pos = a.rfind('\n'); //개행 문자 찾아서 pos로 변수 지정
     13         if(pos != -1 ) //찾는것이 있으면
     14         {
     15             a.erase(pos-1,2); //문자 2개를 지움, 이때 pos에서 2개가 아닌 pos-1에서 2개를 지움
                      //\r\n의 형식으로 되어 있기 때문에 뒤에 문자를 찾게 되겠죠? 그래서 그런듯 싶네요..
     16
     17         }
     18         else
     19             break;
     20     }
     21 }

오늘 오전 내내 이것만 하였군요..

그럼 다들 즐프 하세요 ~_~)~