[C언어] 5주차 배열과 문자열
배열(array)
- 같은 데이터형의 변수 여러 개를 같은 이름으로 묶은 것
- 배열의 각 원소는 메모리에 연속적으로 할당된다.
배열의 선언
데이터형 배열명 [크기]
int arr [5];
- 배열의 크기는 반드시 0보다 큰 정수형 상수로 지정해야 한다.
- 배열의 크기는 리터럴 상수, 매크로 상수로 지정할 수 있다.
//리터럴 상수
int arr [5];
//매크로 상수
#include <stdio.h>
#define num 5
int main(){
int arr[num];
return 0;
}
배열의 초기화
- 배열도 초기화하지 않으면 쓰레기값을 갖는다.
- 초기값을 원소의 개수보다 부족하게 지정하면, 나머지 원소들은 0으로 초기화된다.
- 초기값을 원소의 개수보다 많이 지정하면, 컴파일 에러가 뜬다.
- 초기값을 지정할 때는 배열의 크기를 생략할 수 있다. 이때, 배열의 크기는 초기값의 개수가 된다.
//초기값을 원소의 개수보다 부족하게 지정
int arr1[5] = {1, 2, 3} //arr1 = {1,2,3,0,0}
//초기값을 원소의 개수보다 많이 지정
int arr2[5] = {1, 2, 3, 4, 5, 6} //컴파일 에러
//배열의 크기 생략 가능
int arr3[] = {1, 2, 3, 4, 5} //초기값이 5개이므로 크기가 5인 배열로 선언된다.
인덱스(index)
- 배열의 각 원소에 접근하기 위해 사용한다.
- 항상 0부터 시작한다.
#include <stdio.h>
int main(){
int arr[3] = {1, 2, 3};
printf("%d", arr[0] == 1); //1(True)
printf("%d", arr[1] == 2); //1(True)
printf("%d", arr[2] == 3); //1(True)
return 0;
}
배열의 원소 개수 구하기
- (배열 전체의 바이트 크기) ÷ (배열 원소 하나의 바이트 크기) = (배열 원소의 개수)
#include <stdio.h>
int main(){
int arr[3] = {1, 2, 3};
printf("%d\n", sizeof(arr)); //12: 원소의 개수(3) * int의 크기(4 byte)
printf("%d\n", sizeof(arr)/sizeof(int)); //3: 원소의 개수
return 0;
}
선택 정렬(selection sort)
- 정렬되지 않은 부분 배열에서, 가장 작은 값(오름차순) 또는 가장 큰 값(내림차순)을 찾아 swap하여 정렬하는 방법
#include <stdio.h>
#define size 5
int main(){
int now, temp;
int arr[size] = {2, 3, 5, 1, 4};
for (int i = 0; i < size-1; i++){
now = i;
for (int j = i+1; j < size; j++){
if (arr[now] > arr[j]) now = j;
}
temp = arr[i];
arr[i] = arr[now];
arr[now] = temp;
}
for (int i = 0; i < size; i++) printf("%d\n", arr[i]);
return 0;
}
다차원 배열
- 인덱스를 둘 이상 사용하는 배열
- 보통 2차원 배열까지만 사용한다.
- 1차원 배열처럼 연속된 메모리에 할당된다.
2차원 배열의 선언
데이터형 배열명 [행 개수] [열 개수]
int arr[2][3];
2차원 배열의 초기화
int arr[2][3] = {1, 2, 3, 4} | int arr[2][3] = {{1, 2}, {3, 4}} |
- 초기값을 지정할 때는 행 개수만 생략할 수 있다. 열 개수는 생략할 수 없다.
int arr1[][3] = {1, 2, 3, 4, 5, 6}; //arr1[2][3];으로 할당된다.
int arr2[2][] = {1, 2, 3, 4, 5, 6}; //컴파일 에러
문자 배열(문자열)
- 연속된 문자들의 모임
- 큰따옴표("")로 표현한다.
- 문자열의 끝에는 null 문자('\0')가 함께 저장된다.
문자 배열의 선언
- 문자 배열의 크기는 (저장할 문자열의 길이 + 1)로 할당해야 한다. 문자열의 끝의 null 문자 때문에.
char arr[6]; //길이가 5 이하인 문자열을 저장할 수 있다.
문자 배열의 초기화
- 초기값을 지정할 때 문자 배열의 크기를 생략할 수 있다.
//문자 배열의 초기화
char arr1[5] = "ABCD";
//문자 배열의 크기보다 큰 문자열로 초기화
char arr2[5] = "ABCDE"; //컴파일 에러
//문자 배열의 크기 생략
char arr3 = "ABCDE"; //크기가 6인 배열로 할당된다.
문자 배열의 출력
#include <stdio.h>
int main(){
char arr[4] = "ABC";
printf("%s", arr); //ABC 출력
printf(arr); //ABC 출력
return 0;
}
문자 배열 주의사항
- 배열의 원소가 아닌, 문자 배열 자체에 직접 문자열을 대입할 수 없다.
//배열의 원소에 문자열 대입
char arr1[6] = "Hello";
//배열 자체에 문자열 대입
char arr2 = "Hello"; //컴파일 에러, arr2는 여전히 null
문자열 처리 함수
strcpy 함수
- string copy: 문자열 복사
- 메모리가 충분한지 확인하지 않고 무조건 복사하기 때문에, 문자열의 크기를 확인하고 사용한다.
#include <stdio.h>
#include <string.h>
int main(){
char arr1[10], arr2[10];
strcpy(arr1, "Regulus");
strcpy(arr2, arr1);
printf(arr1); //Regulus 출력
printf(arr2); //Regulus 출력
}
strlen 함수
- string length: null 문자를 제외한 문자열 길이
#include <stdio.h>
#include <string.h>
int main(){
char arr[10] = "Regulus";
printf("%d", strlen(arr)); //7 출력
return 0;
}
strcmp 함수
- string compare: 문자열 내용 비교
반환값 | strcmp(s1, s2)에서 ASCII 코드를 기준으로 |
1 | s1 > s2 |
0 | s1 = s2 |
-1 | s1 < s2 |
#include <stdio.h>
#include <string.h>
int main(){
char arr1[10] = "aaa";
char arr2[10] = "bbb";
char arr3[10] = "ccc";
printf("%d", strcmp(arr3, arr1)); //1 출력
printf("%d", strcmp(arr2, "bbb")); //0 출력
printf("%d", strcmp(arr1, arr3)); //-1 출력
}
== 연산자
- 문자열의 주소만 비교
#include <stdio.h>
int main(){
char arr[10] = "abcde";
printf("%d", arr == "abcde"); //0 출력: arr[0]에 배정된 값의 주소가 "abcde" 이냐고 묻는 것
printf("%d", arr[0] == "a"); //0 출력: arr[0]의 'a'는 문자이고 "a"는 문자열이어서 주소가 다름
printf("%d", arr[0] == 'a'); //1 출력
}
strcat 함수
- string concatenate: 문자열의 끝에 다른 문자열을 연결
#include <stdio.h>
#include <string.h>
int main(){
char arr1[50] = "Regulus";
char arr2[10] = " Arcturus";
strcat(arr1, arr2);
printf(arr1); //Regulus Arcturus 출력
printf(strcat(arr1, " Black")); //Regulus Arcturus Black 출력
}
scanf 함수와 공백
- scanf 함수는 입력한 내용 중 공백 문자(' ', '\t' \n' 등)까지만 입력으로 읽는다.
- 빈칸을 포함한 문자열을 입력 받으려면 %[^마감]s을 사용한다. 마감으로 지정된 것을 입력하기 전까지 입력받겠다는 뜻이다.
#include <stdio.h>
int main(){
char arr1[20];
scanf("%s", arr1); //Regulus Black을 입력하면
printf(arr1); //Regulus만 출력된다.
char arr2[20];
scanf("%[^\n]s", arr2); //Regulus Black을 입력하고 Enter키를 누르면
printf(arr2); //Regulus Black이 출력된다.
char arr3[20];
scanf("%[^z]s", arr3); //Regulus Blackz를 입력하면
printf(arr3); //z가 입력되기 전에 입력된 Regulus Black이 출력된다.
}
gets 함수
- 공백을 포함한 한 줄의 문자열을 입력받는다.
#include <stdio.h>
int main(){
char name[50];
gets(name); //Regulus Arcturus Black 입력
printf(name); //Regulus Arcturus Black 출력
}
sprintf 함수
- 서식을 지정하여 문자열을 만드는 함수
#include <stdio.h>
int main(){
char name[50];
char hello[100];
gets(name); //Regulus Arcturus Black 입력
sprintf(hello, "%s씨, 안녕하세요!", name); //hello 문자열의 내용을 변경한다.
printf(hello); //Regulus Arcturus Black씨, 안녕하세요! 출력
}
puts 함수
- 한 줄의 문자열을 출력하는 함수. 문자열만 출력할 수 있다.
- 문자열을 출력하고 자동으로 줄 바꿈 문자를 출력한다.
2차원 문자 배열
- 행 개수: 필요한 행 개수
- 열 개수: 필요한 열 개수 + 1 (null 문자)
#include <stdio.h>
int main(){
char arr[2][4];
strcpy(arr[0], "AB"); //첫 번째 행에 문자열 "AB" 지정
strcpy(arr[1], "ABC"); //두 번째 행에 문자열 "ABC" 지정
for (int i = 0; i < 2; i++) printf("%s\n", arr[i]);
}
2차원 문자 배열의 초기화
#include <stdio.h>
int main(){
char arr[4][11] = {"GRYFFINDOR", "RAVENCLAW", "HUFFLEPUFF", "SLYTHERIN"};
for (int i = 0; i < 4; i++) puts(arr[i]);
}
- 초기값을 지정할 때는 행 개수만 생략할 수 있다. 열 개수는 생략할 수 없다.
char day[][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; //day[7][4]로 할당된다.
char day[7][] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; //컴파일 에러
[코딩도장] 36.12 연습문제: 2진수를 10진수로 변환하기
다음 소스 코드를 완성하여 배열에 저장된 2진수가 10진수로 출력되게 만드세요. 2진수는 배열에 순서대로 저장되어 있습니다.
#include <stdio.h>
int main()
{
int decimal = 0;
int binary[4] = { 1, 1, 0, 1 }; // 1101 순서대로 저장됨
__________________________________________________________
...
__________________________________________________________
printf("%d\n", decimal);
return 0;
}
답1
#include <stdio.h>
int main(){
int decimal = 0;
int binary[4] = {1, 1, 0, 1};
for (int i = 0; i < 4; i++){
switch (i){
case 0:
decimal += binary[i]*8;
break;
case 1:
decimal += binary[i]*4;
break;
case 2:
decimal += binary[i]*2;
break;
case 3:
decimal += binary[i]*1;
break;
}
}
printf("%d\n", decimal);
return 0;
}
답2
#include <stdio.h>
int main(){
int decimal = 0;
int binary[4] = {1, 1, 0, 1};
for (int i = 0; i < 4; i++){
if (binary[i] == 1) decimal += 1 << 3-i;
}
printf("%d", decimal);
return 0;
}