본문 바로가기
수업 복습/C 복습 노트

[C언어] C언어 수업 10차시

by LimitLog 2021. 5. 18.

1. 문자열 관련 함수 : strcat(), strcpy(), strlen(), strcmp()

문자열 관련 함수들은 기본적으로 헤더파일 string.h 안에 포함되어 있다.

strcat(str1, str2) : str2 문자열을 str1 뒤에 이어 붙여서 반환한다. str1 뒤에 있는 NULL문자는 사라진다.

strcpy(str1, str2) : str2 문자열을 str1 뒤에 복사하여 반환한다. 단, 문자열의 끝을 NULL문자로 인식해 NULL문자까지 복사하며 str1 뒤에 있는 NULL문자 역시 그대로 남아있다.

strlen(str) : str 문자열의 NULL문자가 나올 때까지의 길이를 반환한다.

strcmp(str1, str2, n) : str1 문자열과 str2 문자열에서 지정한 매개변수 n 까지의 범위만 비교하여 문자열이 완전이 같다면 0 을 반환하고 다르면 -1 혹은 1을 반환한다. 여기서 음/양 반환값은 매개변수로 들어온 문자열을 비교하다 다른 문자가 나왔을 경우 그 문자의 아스키 코드 값에 의해 정해지는데, str1 < str2인 경우 음수를, str1 > str2일 경우 양수를 반환한다. 또 n 값을 따로 입력하지 않을 경우 알아서 문자열 전체를 비교한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main() {
    char from[10= "KING", to[10= "";
 
    printf("from : %s ,  to : %s\n",from,to);
 
    strcpy(to, from); //from의 문자열이 to에 복사
    printf("to : %s\n\n",to);
    if (strlen(to) + strlen("princess">= sizeof(to))
        //strlen() 괄호 안의 문자열의 길이를 반환. \0(NULL) 까지의 길이를 세기 때문에 배열 안에 NULL이 있을경우 NULL까지의 길이만 세서 반환한다.
        printf("KING + princess는 배열의 경계를 넘어갑니다. 추가 실패\n");
    else {
        strcat(to, "princess");   //문자열 붙이기 : strcat()
        printf("to : %s\n",to);
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void) {
    char from[10= "KING", to[10= "KING";
    printf("from : %s ,  to : %s\n\n", from, to);
    if (from == to) //배열은 시작 주소가 다르기 때문에 이렇게 비교할 수 없다.
        printf("%s   %s => 두 문자열은 같다.\n", from, to);
    else
        printf("%s   %s => 두 문자열은 같지 않다.\n", from, to);
 
    if (strcmp(from,to)==0
        //strcmp(str1, str2, n) :  str1 문자열과 str2 문자열에서 지정한 매개변수 n까지의 범위만 비교하여 문자열이 완전이 같다면 0을 반환하고 다르면 -1 혹은 1을 반환한다.
        printf("%s   %s => 두 문자열은 같다.\n", from, to);
    else
        printf("%s   %s => 두 문자열은 같지 않다.\n", from, to);
 
    return 0;
}
cs

 

 

 

2. 2차원 배열

다차원 배열이란, 2차원 이상의 배열을 의미한다. 흔히 2차원 배열까지만 주로 사용한다.

2차원 배열은 대괄호[] 를 두번 사용해 선언한다. 첫 번째 대괄호는 세로(열) 크기, 두 번재 대괄호는 가로(행)의 크기가 들어간다. 예를 들어, 세로 3칸에 가로 5칸의 정수형 2차원 배열을 선언하고 싶다면 아래와 같다.

1
int data[3][5];
cs

 

다음은 2차원 배열을 이용한 간단한 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
int main() { //2차원배열 1
    int i, j, N = 1;
    int count[2][3]; //세로 2 가로 3 크기의 2차원 배열
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            count[i][j] = N++//1부터 1씩 더한 값을 순서대로 배열에 대입
            printf("%d : %p   ", count[i][j], &count[i][j]); //배열값 출력과 주소값 출력
        }
        printf("\n");
    }
    return 0;
}
cs

 

다음은 2차원 배열의 메모리 크기를 알아보는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
int main() { //2차원배열 2 :: 배열의 크기를 알아보자
    int i, j;
    int count[2][3= { 10,20,30,40,50,60 };
    printf(" >2차원 배열 전체의 크기 : %d ,  한 행의 크기 : %d ,  하나의 원소의 크기 : %d\n\n",sizeof(count),sizeof(count[0]),sizeof(count[0][0]));
    for (i = 0; i < 2; i++) {
        printf(" >>%d행:",i);
        for (j = 0; j < 3; j++) {
            printf("%3d", count[i][j]);
        }
        printf("\n");
    }
    printf(" >배열의 시작 주소 : %p\n >0행의 시작 주소 : %p\n >1행의 시작 주소 : %p",&count,&count[0][0],&count[1][0]);
}
cs

 

2차원 배열의 선언과 초기화 방법에는 두 가지가 있다. 우선, 1차원 배열처럼 그냥 배열 원소를 쭉 나열할 수 있다. 이렇게 써도 컴퓨터는 행 크기에 맞게 자동으로 줄바꿈되어 인식하기에 문제는 없다만 가독성이 매우 떨어진다. 따라서 한 행 단위로 묶어서 입력하는 방식이 보편적이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(void) { //2차원배열 3 :: 선언 방식
    int data[3][5= { {2,4,6,9,10},{12,14,16,18,20},{22,24,26,28,30} };
    int temp[3][5= { 2,4,6,9,10,12,14,16,18,20,22,24,26,28,30 };
    int row, col;
 
    printf(" >>3행 5열의 2차원 배열 안에 들어있는 짝수를 출력하는 프로그램\n");
    printf(" >DATA\n");
    for (row = 0; row < 3; row++) {
        printf(" %d행 출력: ", row+1);
        for (col = 0; col < 5;col++) {
            printf("%3d ",data[row][col]);
        }
        printf("\n");
    }
    printf("\n >TEMP\n");
    for (row = 0; row < 3; row++) {
        printf(" %d행 출력: ", row + 1);
        for (col = 0; col < 5; col++) {
            printf("%3d ", temp[row][col]);
        }
        printf("\n");
    }
}
 
cs

 

여기까지 이해가 되었다면, 다음과 같은 결과를 출력해 보자.

.

.

.

.

.

.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(void) { //2차원배열 4
    int data[7][7];
    int n ,m=1;
 
    for (int i = 0; i < 7; i++) {
        n = m;
        for (int j = 0; j <= i; j++) {
            data[i][j] = n++;
        }
        m += 7;
    }
 
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j <= i; j++)
            printf("%3d", data[i][j]);
        printf("\n");
    }
    return 0;
}
cs

이중 반복문과 2차원 배열을 잘 이해하고 활용하면 그 자체로 어려운 알고리즘은 절대 아니다.

 

 

 

3. 전치행렬

전치행렬이란 행과 열을 교환하여 얻는 행렬을 의미한다. 주대각선을 기준으로 반사 대칭을 가하여 얻을 수 있다.

알고리즘은 어렵지 않다. 제어변수 i와 j의 위치를 서로 바꾸어 값을 대입하면 해결되는 문제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(void) { //전치행렬
    int data_a[3][3= { {13,4,30},{34,2,5},{7,15,27} }, data_b[3][3= { 0, };
 
    printf(" >>전치행렬\n\n");
    printf(" >정렬 이전\n");
    for (int i = 0; i < 3; i++) {
        printf(" %d행: ",i);
        for (int j = 0; j < 3; j++) {
            printf("%2d  ",data_a[i][j]);
            data_b[i][j] = data_a[j][i];
        }
        printf("\n");
    }
    printf("\n >정렬 이후\n");
    for (int i = 0; i < 3; i++) {
        printf(" %d행: ", i);
        for (int j = 0; j < 3; j++) {
            printf("%2d  ", data_b[i][j]);
        }
        printf("\n");
    }
    return 0;
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main(void) { //전치행렬2
    int arr1[3][4= { {1,2,3,4},{5,6 , 7,8} ,{9 , 10,11,12 } };
    int arr2[4][3];
    int i, j;
 
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%3d ", arr1[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            arr2[j][i] = arr1[i][j];
        }
    }
 
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3; j++) {
            printf("%3d ",arr2[i][j]);
        }
        printf("\n");
    }
    return 0;
};
cs

'수업 복습 > C 복습 노트' 카테고리의 다른 글

[C언어] C언어 수업 12차시  (0) 2021.06.01
[C언어] C언어 수업 11차시  (0) 2021.05.25
[C언어] C언어 수업 9차시  (0) 2021.05.11
[C언어] C언어 수업 8차시  (0) 2021.05.04
[C언어] C언어 수업 7차시  (0) 2021.04.20

댓글