728x90

25-2

문제1) 프로그램 사용자로부터 문자열을 입력받아서 입력 받은 문자열의 단어를 역으로 출력하는 프로그램을 작성해보자. 예를 들어서 'I am a boy'가 입력되면 다음의 출력을 보여야 한다.

 'boy a am I'

단! 문자열의 입력에 앞서 프로그램 사용자가 입력할 문자열의 최대길이 정보를 먼저 입력받기로 하자. 그리고 그 길이만큼 메모리 공간을 동적으로 할당해서 문자열을 입력받기로하자.

참고로 이문제에서는 메모리의 동적할당 이외에 문자열의 단어를 역으로 출력하라는 비교적 어려운 주젲를 여러분에게 제시하고 잇다. 이문제를 해결하는 방법은 여러가지이다. 따라서 여유를 가지고 여러분 나름의 방법을 찾아서 구현해보기 바란다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    int n,len;
    char *str;
    scanf("%d", &n);
    getchar();
    str=(char *)malloc(sizeof(char)*(n+1));
    printf("Change the sentence. ");
    fgets(str,n+1,stdin);
    str[strlen(str)-1]=0;
    len=strlen(str);

    for(int i=len;i>0;i--){
        if(str[i]==' '){
            printf("%s ", &str[i+1]);
            str[i]=0;
        }
        
    }
    printf("%s",&str[0] );
    free(str);
    return 0;
}

나 혼자 단독으로 짜다가 안되는 부분이 있어서 결국 답지를 보고 말았다. 동적할당에서도 약간의 틀어짐이 있었기 때문이다. 일단 입력을 받을 때 \n을 없애주는 작업이 필수적인 것을 기억하자. 이것이 바로 getchar()이다.

그리고 fgets를 이용해야한다. 처음에는 모르고 gets로 입력받았다. 생각해보니 이것을 해야하는 이유가 문장이기 때문이다. 앞에서는 한 단어만 입력하면 되었기에 가능했던 일이었다. 문장은 fgets(어디에, 크기는, 입력인 stdin)을 이용하자

그리고 끝부분을 없애주기 위해서 len-1값을 0이라고 선언했다. 자동으로 \n부분이 있기 때문이다. 그리고 그 만큼 자리를 만들어 준다.

 

음 다음으로는 for문으로 거꾸로 해주는 작업이 필요하다. 이제 빈칸이 생기면 그 위에것들을 출력한다. 그리고 빈칸은 0으로 작업을 해준다. 그러면 그 뒤부터는 쭉 나올 것이다. 마지막 부분은 printf를 이용해 출력을 시켜주고 이것은 주솟값으로 탐색해준다. 메모리 할당을 위해 포인터를 이용했기 때문이다.

 

메모리할당 후에는 꼭 free로 메모리 해제를 해주어야 한다.


문제2) 프로그램 사용자로부터 정수를 입력받는다. -1이 입력될 때까지 계속해서 입력받아서, 프로그램 종료 직전에 입력 받은 정수 전부를 순서대로 출력하는 프로그램을 작성해보자. 그런데 이 문제의 핵심은 프로그램 사용자가 몇개의 정수를 입력할지 모른다는데 있다. 그래서 이 문제 해결을 위해서 힙 영역을 사용하기로 하겠다. 일단은 길이가 5인 int형 배열을 힙에 할당하자. 그리고 배열이 꽉 찰때마다 길이를 3씩 늘리기로 하자. 이 때 앞서 소개한 realloc함수를 이용하면 상대적으로 쉽게 배열의 길이를 늘릴 수 있다.

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int arrlen=5;
    int i=0;
    int * arr=(int *)malloc(sizeof(int)*arrlen);
    while(1){
        printf("숫자 입력해주세요. -1 되면 종료");
        scanf("%d", &arr[i]);
        if(arr[i]==-1){
            break;
        }
        if(arrlen==i+1){
            arrlen+=3;
            arr=(int *)realloc(arr,sizeof(int)*arrlen);
        }
        i++;
    }
    for(int j=0;j<i;j++){
        printf("%d ", arr[j]);
    }
    free(arr);
    return 0;
}

내가 만들고 싶은ㄴ대로 하다가 방향을 튼 케이스다. 할당ㄲ지는 일단 어렵지 않았는데 while 문안에서 arrlen ==i+1 이 부분을 작성하지를 못했다. 그래서 꽉 찰때 마다 하는 것을 제대로 만들지 못한 if문으로 확장을 해주었다. 이것이 문제였던 것 같다. 여기서 말하는 arrlen==i+1은 확장하기 위한 식인데 이제 배열은 한개가 작으므로 +1을 하여 비교를 해주었을 때 같다는 말은 꽉찼다는 얘기가 된다. 그래서 확장이 필요하다. 근데 여기서 길이를 3씩 늘리라고 하였는데 arrlen+=3을 하여서 기존보다 3을 늘려서 곱해주면 그만큼 메모리 할당이 되게 된다. 그리고 while 문이라서 i가 자동 증가가 되지 않으므로 별도의 식이 필요하다. while문 탈출하면 i 길이만큼 for문을 반복해주고 메모리 할당을 했으므로 해제를 해주고 종료를 하면 된다.

728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈C 문제풀이 26  (0) 2021.08.12
[C] 열혈C 문제풀이 24  (0) 2021.08.12
[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 16-1  (0) 2021.08.12
[C] 열혈C 문제풀이 14-1  (0) 2021.08.12

+ Recent posts