정리하자
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; } |
'0x0001 > C, C++' 카테고리의 다른 글
[C언어] 10진수를 2진수로 (0) | 2019.02.08 |
---|---|
[C언어] 최대공약수, 최소공배수 (0) | 2019.02.08 |
[C++] const, static 클래스 멤버 (0) | 2019.02.08 |
[C언어] 메모리 관리와 동적할당 (0) | 2019.02.08 |
[C언어] 함수 포인터, void형 포인터 (0) | 2019.02.07 |