c언어 문제

조회수 1822회

c언어 문제인데 이차원 정수형 배열을 이용하여 3X3행렬을 입력하고 출력하고 적당한 함수를 만들어서 1행과 2행을 교환한 후 출력하는 문제인데 a b c d e f g 입력하다가 작동이 중지됬습니다가 뜨네요

경고는 . warning C4047: '함수': 'char **'의 간접 참조 수준이 'char [3][3]'과(와) 다릅니다. warning C4024: 'change_array': 형식 및 실제 매개 변수 1의 형식이 서로 다릅니다. 뜨는데 뭐가 문제인지 모르겠습니다.


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


void change_array(char **a)
{
    char *temp = malloc(sizeof(char)*3); ;
    for (int i = 0; i <= 2; i++) {
         *(temp+i) = *(*(a + i));
        *(*(a + i)) = *(*(a+i)+1);
        *(*(a + i) + 1) = *(temp + i);
    }
}
int main()
{
    int i, j,b,c;
    char a[3][3];
    for (i = 0; i <= 2; i++) {
        for (j = 0; j <= 2; j++) {
            scanf("%c ", &a[i][j]);
        }
    }
    change_array(a);
    printf("array is changed\n");
    for (b = 0; b < 3; b++) {
        for (c = 0; c < 3; c++) {
            printf("%c", a[b][c]);
        }
        printf("\n");
    }

}

1 답변

  • 첫번재 IO BUFFER 라는 개념이 있습니다.

    scanf 함수로 입력을 받을 때 IO buffer 라는 곳에 저장이 되는데 입력을 할 때 값을 넣고 엔터키를 칩니다.

    그러면 엔터키 값은 다음번 scanf 때 저장이 됩니다.

    원하는 결과가 아니죠...그래서 buffer 을 비우는 코드가 필요합니다.

    두번째 배열은 상수입니다. 바꿀수가 없다는 의미입니다.

    change_array 함수에서 배열요소에 재할당을 하면 세그먼트 폴트가 발생할 겁니다.

    세번째 배열과 포인터는 분명히 다른겁니다. 그런 이유로 컴파일러는 경고를 내어줍니다.

    최대한 필요한 부분만 단순하게 수정했습니다.

    #include <stdio.h>
    #include <stdlib.h>
    
    
    void change_array(char **a)
    {
        char *temp = malloc(sizeof(char)*3); ;
        for (int i = 0; i <= 2; i++) {
             *(temp+i) = *(*(a + i));
            *(*(a + i)) = *(*(a+i)+1);
            *(*(a + i) + 1) = *(temp + i);
        }
    }
    int main()
    {
        int i, j,b,c;
        //char a[3][3];
        // 2차원 포인터 초기화
            char **a = (char**)malloc(sizeof(char) * 3);
            for(int index = 0; index < 3; index++){
                    a[index] = (char*)malloc(sizeof(char) * 3);
            }
    
        for (i = 0; i <= 2; i++) {
            for (j = 0; j <= 2; j++) {
                scanf("%c", &a[i][j]);
                            getchar();     //<- 수정. 버퍼 클리어
            }
        }
    
        change_array(a);
        printf("array is changed\n");
        for (b = 0; b < 3; b++) {
            for (c = 0; c < 3; c++) {
                printf("%c", a[b][c]);
            }
            printf("\n");
        }
    
    }
    

    테스트 및 결과

    gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
    
    allinux@ip-10-0-0-29:~$ gcc -std=c99 -o sample sample.c
    allinux@ip-10-0-0-29:~$ ./sample
    1
    2
    3
    4
    5
    6
    7
    8
    9
    array is changed
    213
    546
    879
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)