c언어 문제
조회수 1823회
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
댓글 입력