프로그래밍/C,C++

[C/C++] 예제_영어 문자열을 입력받아 대-소-대-소문자로 변경하기

gameObject 2023. 6. 7. 20:45
728x90

작성시 발생했던 오류

1. 배열을 초기화를 시키지 않아서 쓰레기값이 출력할때 발생했습니다.

 - 쓸모없는 문자들이 왜 발생하는지, 처음에는 sizeof(str)로 조건식을 처리하고있기 때문에 값이 들어가있지 않은 배열 (ex_299번째 배열)에 쓰레기값이 당연히 들어있어서 저렇게 나오는것으로 생각하고 값이 들어있는 배열칸 이외에는 제외하고 계산을 해보려고 했으나. 현재까지 배운 함수로는 해결방법을 찾을 수 없었습니다.

 - 그 다음 삭제하는 방법을 소스코드 뒤쪽에서 처리하려고 NULL값도 줘보고, 원하는 값을 제외한 값이 들어올 경우 NULL로도 처리해보려고 했지만 해결이 되지 않았습니다.

 - 배열을 초기화시켜보니 해결이 깔끔하게 완료되었습니다.

 

2. 앞에서 선언을 안해주거나, 여러 예제들을 공부중이라 main에서 다른 함수를 호출했을 경우 오류 발생

3. %s를 통해 printf를 해줄 경우 문자열 마지막에는 Null값이 들어가 있어서 처리되지 않은 Null값을 만나게되면 강제로 종료되게 됩니다.

 - 따라서 루프를 돌릴때 Null값 자리를 빼주는것이 중요합니다. (이번에는 -1을 처리해주었음)

//문자열을 입력받아서 대문자 - 소문자 - 대문자 - 소문자 순으로 수정해서 출력하는 프로그램 (easy)
//위의 프로그램을 수정해서 거꾸로 뒤집어서 출력하는 프로그램 작성 (normal)

// 오류 : 초기화를 안시켰을때 쓰레기값 발생, 앞에서 선언안해줬을때, main에서 호출 안해준 경우
// sizeof()를 하게되면 배열 전체크기가 반환된다.
// 오류 : %s를 통해 printf해줄경우 마지막에 Null값이 들어있어서 -1처리 해줘야 한다.

#include <iostream>
using namespae std;

int main()
{
	mission();
}

void mission()
{
    char str[300] = {0};
    char str2[300] ={0};
    bool t= true;

    cin >> str;

    for(int i = 0; i < sizeof(str); i++) //str사이즈에 맞춰서 반복
    {
        int b;
        b = str[i];

        if(t == true)//특수문자에 따른 스위치
        {
            if((i%2)==0)
            {
                if(b >= 65 && b <= 90) 
                {
                    str[i] = b;
                }
                    else if(b >= 97 && b <= 122)
                {
                    b = b-32;
                    str[i] = b;
                }
            }
            else if((i%2)==1)
            {
                if(b >= 65 && b <= 90)
                {
                    b = b+32;
                    str[i] = b;
                }
                    else if(b >= 97 && b <= 122)
                {
                    str[i] = b;
                }
            }
        }
        else if(t == false) //특수문자에 따른 스위치
        {
            if((i%2)==0)
            {
                if(b >= 65 && b <= 90)
                {
                    b = b+32;
                    str[i] = b;
                }
                    else if(b >= 97 && b <= 122)
                {
                    str[i] = b;
                }
            }
            else if((i%2)==1)
            {
                if(b >= 65 && b <= 90)
                {
                    str[i] = b;
                }
                    else if(b >= 97 && b <= 122)
                {
                    b = b-32;
                    str[i] = b;
                }
            }
        }else
        {
            str[i]= NULL;
        }
		
        // 특수문자가 입력될경우 true -> false, false -> true
        if(((b >= 65 && b <= 90)||(b >= 97 && b <= 122))==0)
        {   
            t = !t;
        }
        // 특수문자가 입력될 경우
    }


    cout << str << endl;


    // 거꾸로 출력해주는 부분
    int d = sizeof(str)-1;
    int f = 0;
	

    while(d>=0)
    {
        if(str[d]!=NULL)
        {
            str2[f] = str[d];
            printf("%c",str2[f]);
            f++;
        }
        d--;
    }
    // 거꾸로 출력해주는 부분
}

 

 

예제 2

대문자 > 소문자

소문자 > 대문자

대문자 소문자 변환
void mission()
{
    char str[300];

    cin >> str;

    for(int i = 0; i < sizeof(str); i++)
    {
        int b;
        b = str[i];
        if(b >= 65 && b <= 90)
        {
            b = b+32;
            str[i] = b;
        }
        else if(b >= 97 && b <= 122)
        {
            b = b-32;
            str[i] = b;
        }
    }

    cout << str;
    
}
728x90