정리하자

 

i am a boy -> yob a ma i 바꾸는 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <tchar.h>
#include <string>
 
void getReverseStr( TCHAR * str ){
    
    // NULL문자를 제외한 문자열 길이를 리턴
    int len= _tcslen(str);    
    for(int i =0; i < len/2; ++i ){
 
        // 배열이 0 부터시작이므로, 문자열길이 - 1 
        TCHAR temp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = temp;
    }
 
    _tprintf(L"Reverse : %s\n" , str);
}
 
int main(){
 
    /**
    * wprintf는 지역 설정에 영향을 받는 함수입니다.
    * 그래서 한글 출력을 하기 전에 지역을 설정하는 함수를 호출해야 합니다.
    * 이를 위해 Visual C++은 setlocale, _wsetlocale이라는 함수들을 제공합니다.
    * 대한민국으로 설정하려면 다음과 같이 호출해 주세요.
    */
 
    _wsetlocale(LC_ALL, L"korean");
 
    TCHAR pStr[100] = _T("i am a boy");
    getReverseStr(pStr);
    system("pause");
    return 0;
}

 

 

 

 

i am a boy -> yob a ma i -> boy a am i 로 변환하는코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char * reverse_string( const char* ori )
{
    /**
     * 문자열을 fgets함수로 입력받으면 enterkey 문자까지 함께 들어간다.
     */
    int arrayCnt = 0, oriSize = strlen(ori)+1;
    char * rStr = (char*)(malloc(sizeof(char) * oriSize) );
    memset(rStr, 0, sizeof(char) * oriSize );
 
    //oriSize -= 2; // NULL문자 ENTER 키값 빼주고
    do{
        if( ori[oriSize] != 0 && ori[oriSize] != 10 )
         rStr[arrayCnt++]= ori[oriSize];
    }while( --oriSize >= 0 );
 
    rStr[arrayCnt] = '\0';
 
    /**
     * NULL 문자를 위에서 다시 넣어주는 이유는
     * 바꿔준 문자의 끝을 알리기 위해서 넣어주는 것이다.
     * 그렇지 않으면, 쓰게기 값이 들어간다. 
     * 처음부터 rStr을 초기화 해주는것도 방법이 될수있다.
     */
    return rStr;
}
char * reverse_word( const char* ori )
{
    /**
     * 입력받은 스티링이 yob_a_ma_i\0 총 10바이트 == gets함수
     * gets함수로 스트링을 받을경우 동적배열 생산시 길이에 + 1 해줘야함
     * 안해주면 0 - 9 즉 10개의 배열로 구성됨 사실상 \0 문자를 넣을때가 없어짐     
     * 하지만 fgets함수로 받을경우 enterkey 포함 11바이트 길이가 넘어온다.
     * +1 안해줘도 문자열 갯수에 맞게 널문자까지 알아서 들어감
     * 하지만 함수에서 문자열끝을 입력하므로 +1을 나둬도 상관없고, 
     * 1바이트가 아까으면 fgets함수와 gets함수에따라 바꿔주자
     */
    
    int arrayCnt = 0, wordCnt = 0, oriSize = strlen( ori )+1;
    char * rStr = (char*)(malloc(sizeof(char) * oriSize) );        
    memset(rStr, 0, sizeof(char) * oriSize ); 
 
    size_t cnt = 0;
    const char *p, *t; 
 
    for( p=ori; *ori; )
    { 
        // 공백이나 문자열의 끝이 나오는 위치 찾기 (fgets함수 enterkey 체크포함)
        while( *ori != ' ' && *ori != 0 && *ori != 10 ) 
        {
            ori++; 
        }
 
        // 현재 위치를 임시로 저장.     
        t = ori+1;
 
        // 현재 위치부터 거꾸로 출력 문자열에 저장. 
        while( ori != p ) 
        {
            rStr[cnt++] = *(--ori); 
        }
 
        // 하나의 단어가 끝나면 공백 삽입 
        rStr[cnt++] = ' ';
        p=t, ori=t;
 
        if( cnt == oriSize )
            break;
    } 
    // 문자열의 끝 마크. 
    rStr[cnt-1] = '\0'
 
    return rStr;
}
int main()
{
    /**
     * i am a boy -> yob a am i -> boy a am i 바꾸기
     */
    //char * str1 = "i am a boy";
    char str1[20];
    memset( str1, 0, sizeof(str1));
 
    fputs("InputString : ", stdout );
    //fgets(str1, sizeof(str1), stdin);
    gets(str1);
 
//    char * str2 =reverse_string( str1 );
//    puts(str2);
    // 이함수에 전달할때 쓰레기값.... 일단 생각해보자
 
    char * str3 =reverse_word( str1 );    
    puts(str3);
 
    //free(str2);    
    free(str3);    
 
    system("pause");
    return 0;
}


+ Recent posts