[C++] 문자열 다루기 : 문자열 복사/반전/ String으로 변환/String 반전

amudomolla·2023년 5월 29일
0

C++

목록 보기
7/12
post-thumbnail

참고 사이트


🌱 입력 받은 char 배열 복사/반전 및 string으로 변환/변환된 string 반전

제한조건

  • string 변환 함수를 제외한 모든 함수는 iostream 헤더파일로만 구현
  • trans_str()는 함수 내에서 std::cout 출력하기

1. 문자열 입력받기

#include <iostream>

int main()
{
    char ch[20];

    std::cout << "문자열 입력 : ";
    std::cin >> ch;
}

2. 입력 받은 문자열 길이 구하기

#include <iostream>

// 문자열 길이
int my_strlen(char *ch) {

    int len = 0;

    for(int i = 0; ch[i] != 0; i++) {
        len += 1;
    }
    return len;
}

int main()
{
    char ch[20];

    std::cout << "문자열 입력 : ";
    std::cin >> ch;

    int len = my_strlen(ch);
    std::cout << "문자열 길이 : " << len;
}
[입력]
hello
[출력]
문자열 입력 : abcdef
문자열 길이 : 6
  • ch 에는 아래와 같이 문자 배열이 저장되어 있다.

  • my_strlen()는 ch[i] = NULL-1인 ch[5] 까지만 반복한다.
    총 6번의 반복을 거치므로 len에는 6이 저장된다.


3. 입력 받은 문자열 복사하기

#include <iostream>

// 문자열 길이
int my_strlen(char *ch) {

    int len = 0;

    for(int i = 0; ch[i] != 0; i++) {
        len += 1;
    }
    return len;
}

// 문자열 복사
// 입력 받은 char 배열을 for문을 통해 하나씩 가져와서
// chcpy에 저장
char my_strcpy(char *ch, char *chcpy) {
    for(int i = 0; ch[i] != 0; i++) {
        chcpy[i] += ch[i];  // chcpy에는 NULL-1 까지만 저장
    }
    return 0;
}

int main()
{
    char ch[20];
    char chcpy[20];

    std::cout << "문자열 입력 : ";
    std::cin >> ch;

    int len = my_strlen(ch);
    std::cout << "문자열 길이 : " << len << '\n' << '\n';

    my_strcpy(ch,chcpy);
    std::cout << "char 복사 : " << chcpy;
}
[출력]
문자열 입력 : abcdef
문자열 길이 : 6

char 복사 : abcdef

4. 매크로 및 입력 받은 문자열 반전

#include <iostream>
#define ARRAY_LENGTH 20  // 매크로 값 20으로 선언

// 문자열 길이
int my_strlen(char *ch) {

    int len = 0;

    for(int i = 0; ch[i] != 0; i++) {
        len += 1;  // ch[NULL-1] 까지이므로 len에는 6이 저장
    }
    return len;
}

// 문자열 복사
// 입력 받은 char 배열을 for문을 통해 하나씩 가져와서
// chcpy에 저장
char my_strcpy(char *ch, char *chcpy) {
    for(int i = 0; ch[i] != 0; i++) {
        chcpy[i] += ch[i];  // chcpy에는 NULL-1 까지만 저장
    }
    return 0;
}

// 문자열 반전
char my_strrev(char *ch) {

    int len = my_strlen(ch);  // len = 6 (ch[len] = NULL)

    len -= 1;  // len = 5 (ch[len] = NULL-1)

    char ch_temp[ARRAY_LENGTH];  // 임시 버퍼 배열 초기화
    
	// swap
    for(int i = 0; i < len; len--, i++) {
        *ch_temp = ch[i];
        ch[i] = ch[len];
        ch[len] = *ch_temp;
    }
    return 0;
}

int main()
{
    char ch[ARRAY_LENGTH];
    char chcpy[ARRAY_LENGTH];

    std::cout << "문자열 입력 : ";
    std::cin >> ch;

    int len = my_strlen(ch);
    std::cout << "문자열 길이 : " << len << '\n' << '\n';

    my_strcpy(ch,chcpy);
    std::cout << "char 복사 : " << chcpy << '\n';

    my_strrev(ch);
    std::cout << "char 반전 : " << ch << '\n';
}
[출력]
문자열 입력 : abcdef
문자열 길이 : 6

char 복사 : abcdef
char 반전 : fedcba


5. char 배열 -> string으로 변환

여기부터는 string.h 헤더파일 추가해 메소드 사용

1) my_strrev() 함수에서 반전된 문자열 다시 반전시키기

char *ch_reverse = strrev(ch);

2) string으로 변환

std::string str(ch_reverse);
std::cout << "string 복사 : " << ch_reverse << '\n';

6. string 반전

1) string 길이 구하기

int len = str.length();

2) swap

char trans_str(char *ch) {
    // 1. 'ch'이 my_strrev() 함수를 거치면서 반전된 상태이므로 다시 반전
    char *ch_reverse = strrev(ch);

    // 2. char 배열 -> string으로 변환
    std::string str(ch_reverse);
    std::cout << "string 복사 : " << ch_reverse << '\n';

    // 3. string 반전
    int len = str.length();
    // 방법 #1
    for(int i = 0; i < len/2; i++) {
        int str_temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = str_temp;
    }
    // 방법 #2
//    len -= 1;
//
//    for(int i = 0; i < len; len--, i++) {
//        int str_temp = str[i];
//        str[i] = str[len];
//        str[len] = str_temp;
//    }
    std::cout << "string 반전 : " << str << '\n';
}
[출력]
문자열 입력 : abcdef
문자열 길이 : 6

char 복사 : abcdef
char 반전 : fedcba

string 복사 : abcdef
string 반전 : fedcba

  • str[len-1-i]
    • len - 1
      : len은 NULL까지 포함된 값이 저장되어 있기 때문에, 이 NULL을 빼기 위해서 -1을 해준다.
    • len - 1 - i
      : 위의 배열표를 대입하자면,
      len = 6일 때, str[len-1-i] => str[5-i]
      i = 0일 때, str[5]의 값과 교환
      i = 1일 때, str[4]의 값과 교환

7. 입력받은 문자열 예외처리

int main()
{
    char ch[ARRAY_LENGTH];
    char chcpy[ARRAY_LENGTH];

    std::cout << "문자열 입력 : ";
    std::cin >> ch;

    int len = my_strlen(ch);
    std::cout << "문자열 길이 : " << len << '\n' << '\n';
    
	// 입력 받은 문자열 예외처리
    // 20을 넘기지 않으면, 정상출력
    // 넘길 시, 범위를 벗어났음을 알림
    if(len < 20) {
        my_strcpy(ch,chcpy);
        std::cout << "char 복사 : " << chcpy << '\n';

        my_strrev(ch);
        std::cout << "char 반전 : " << ch << '\n' <<'\n';

        trans_str(ch);
    }
    else {
        std::cout << "범위를 벗어났습니다.";
    }
}
[출력] 범위를 벗어나지 않았을 경우

문자열 입력 : abcdef
문자열 길이 : 6

char 복사 : abcdef
char 반전 : fedcba

string 복사 : abcdef
string 반전 : fedcba
[출력] 범위를 벗어났을 경우
문자열 입력 : ajskldjflkjfal;sjfdlk;
문자열 길이 : 22

범위를 벗어났습니다.

👨‍💻 최종 소스코드

#include <iostream>
#include <string.h>
#define ARRAY_LENGTH 20

// 문자열 길이
int my_strlen(char *ch) {

    int len = 0;

    for(int i = 0; ch[i] != 0; i++) {
        len += 1;  // ch[NULL-1] 까지이므로 len에는 6이 저장
    }
    return len;
}

// 문자열 복사
// 입력 받은 char 배열을 for문을 통해 하나씩 가져와서
// chcpy에 저장
char my_strcpy(char *ch, char *chcpy) {
    for(int i = 0; ch[i] != 0; i++) {
        chcpy[i] += ch[i];  // chcpy에는 NULL-1 까지만 저장
    }
    return 0;
}

// 문자열 반전
char my_strrev(char *ch) {

    int len = my_strlen(ch);  // len = 6

    len -= 1;  // len = 5

    char ch_temp[ARRAY_LENGTH];  // 임시 버퍼 배열 초기화

    // swap
    for(int i = 0; i < len; len--, i++) {
        *ch_temp = ch[i];
        ch[i] = ch[len];
        ch[len] = *ch_temp;
    }
    return 0;
}

// string
char trans_str(char *ch) {
    // 1. 'ch'이 my_strrev() 함수를 거치면서 반전된 상태이므로 다시 반전
    char *ch_reverse = strrev(ch);

    // 2. char 배열 -> string으로 변환
    std::string str(ch_reverse);
    std::cout << "string 복사 : " << ch_reverse << '\n';

    // 3. string 반전
    int len = str.length();
    // 방법 #1
    for(int i = 0; i < len/2; i++) {
        int str_temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = str_temp;
    }
    // 방법 #2
//    len -= 1;
//
//    for(int i = 0; i < len; len--, i++) {
//        int str_temp = str[i];
//        str[i] = str[len];
//        str[len] = str_temp;
//    }
    std::cout << "string 반전 : " << str << '\n';
}

int main()
{
    char ch[ARRAY_LENGTH];
    char chcpy[ARRAY_LENGTH];

    std::cout << "문자열 입력 : ";
    std::cin >> ch;

    int len = my_strlen(ch);
    std::cout << "문자열 길이 : " << len << '\n' << '\n';
    
	// 입력 받은 문자열 예외처리
    // 20을 넘기지 않으면, 정상출력
    // 넘길 시, 범위를 벗어났음을 알림
    if(len < 20) {

        my_strcpy(ch,chcpy);
        std::cout << "char 복사 : " << chcpy << '\n';

        my_strrev(ch);
        std::cout << "char 반전 : " << ch << '\n' <<'\n';

        trans_str(ch);
    }
    else {
        std::cout << "범위를 벗어났습니다.";
    }
}
profile
👩‍💻 기록 및 복습을 위함

0개의 댓글