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 |
댓글