본문 바로가기

자린고비 독학하기/자린고비 코딩하기

C 언어 코딩 도장 빨리 끝내기 - 3 : 배열 / 문자열

반응형

c 언어 기초 그만 좀 보고 싶어서 빨리 끝내 보려고 합니다 

3 : 배열 / 문자열 

 

포인터 개념이 있어서 자바와 조금 다르네! 신기함! 

 

 

핵심 정리 1: https://dojang.io/mod/page/view.php?id=673

 

C 언어 코딩 도장: 핵심 정리

배열 배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태입니다. [ ]에 크기를 지정하여 선언하며 선언된 배열에서 [ ]사이에 인덱스를 지정하여 요소에 접근합니다. 특히 배열의 인덱스는 0부터 시작합니다. 자료형 배열이름[크기]; // 배열 선언하기 자료형 배열이름[크기] = { 값, 값, 값 }; // 배열을 선언하면서 값을 초기화하기 배열[인덱스]; // 배열의 요소에 접근 배열[0]; // 배열의 인덱스는 0부터 시작하므로 첫 번째 요소 배열[인덱스]

dojang.io

 

핵심 정리

배열

배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태입니다. [ ]에 크기를 지정하여 선언하며 선언된 배열에서 [ ]사이에 인덱스를 지정하여 요소에 접근합니다. 특히 배열의 인덱스는 0부터 시작합니다.

자료형 배열이름[크기]; // 배열 선언하기

자료형 배열이름[크기] = { , , }; // 배열을 선언하면서 값을 초기화하기

배열[인덱스]; // 배열의 요소에 접근

배열[0]; // 배열의 인덱스는 0부터 시작하므로 첫 번째 요소

배열[인덱스] = ; // 배열의 요소에 값 저장

자료형 *포인터; // 배열을 넣을 수 있는 포인터

 

2차원 배열

2차원 배열은 가로x세로의 평면 구조로 이루어져 있습니다. 2차원 배열을 선언할 때는 [ ]를 두 번 사용하여 선언하며 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정합니다. 일반적으로 2차원 공간은 가로x세로로 표기하지만 배열로 만들 때는 세로x가로로 표기합니다.

자료형 배열이름[세로크기][가로크기]; // 2차원 배열 선언하기 자료형 배열이름[세로크기][가로크기] = { { , , }, {, , } }; // 2차원 배열을 선언하면서 // 값 초기화하기 배열[세로인덱스][가로인덱스]; // 2차원 배열의 요소에 접근 배열[세로인덱스][가로인덱스] = ; // 2차원 배열의 요소에 값 저장 자료형 (*포인터이름)[가로크기]; // 2차원 배열을 넣을 수 있는 포인터

3차원 배열

3차원 배열은 높이x세로x가로 형태로 이루어져 있습니다. 3차원 배열은 [ ]에 높이, 세로 크기, 가로 크기를 지정하여 선언합니다. 3차원 공간은 가로x세로x높이로 표기하지만 배열로 만들 때는 높이x세로x가로로 표기합니다.

자료형 배열이름[높이][세로크기][가로크기]; // 3차원 배열 선언하기

자료형 배열이름[높이][세로크기][가로크기] = { // 2차원 배열을 선언하면서 값 초기화하기 { { , , }, { , , } }, { { , , }, { , , } } };

배열[높이인덱스][세로인덱스][가로인덱스]; // 3차원 배열의 요소에 접근

배열[높이인덱스][세로인덱스][가로인덱스] = ; // 3차원 배열의 요소에 값 저장 자료형 (*포인터이름)[세로크기][가로크기]; // 3차원 배열을 넣을 수 있는 포인터

배열의 크기 구하기

배열의 크기를 구할 때는 sizeof 연산자를 사용합니다.

sizeof(배열); // 배열이 차지하는 전체 공간 구하기

sizeof(배열) / sizeof(자료형)); // 배열의 크기 구하기 // 배열이 차지하는 전체 공간을 요소의 크기로 나눠줌 // 또는 sizeof(배열) / sizeof(배열[0]); sizeof(배열) / sizeof(배열[0]); // 2차원 배열의 세로 크기를 구하기 // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌 sizeof(배열[0]) / sizeof(자료형); // 2차원 배열의 가로 크기 구하기 // 가로 한 줄의 크기를 요소의 크기로 나눠줌 // 또는 sizeof(배열[0]) / sizeof(배열[0][0]); sizeof(배열) / sizeof(배열[0]); // 3차원 배열의 높이 구하기 // 배열이 차지하는 전체 공간을 면의 크기로 나눠줌 sizeof(배열[0]) / sizeof(배열[0][0]); // 3차원 배열의 세로 크기 구하기 // 한 면의 크기를 가로 한 줄의 크기로 나눠줌 sizeof(배열[0][0]) / sizeof(자료형); // 3차원 배열의 가로 크기 구하기 // 가로 한 줄의 크기를 요소의 크기로 나눠줌 // 또는 sizeof(배열[0][0]) / sizeof(배열[0][0][0]);

포인터를 배열처럼 사용하기

포인터에 메모리를 할당한 뒤 [ ]에 인덱스를 지정하면 배열처럼 사용할 수 있습니다.

자료형 *포인터이름 = malloc(sizeof(자료형) * 크기); // 포인터를 배열처럼 사용할 수 있음

포인터[인덱스] // 포인터 사용

free(포인터); // 메모리 해제

포인터를 2차원 배열처럼 사용하려면 이중 포인터를 선언한 뒤 세로 공간 메모리를 할당하고, 반복문으로 가로 공간 메모리를 할당하면 됩니다. 해제할 때는 가로 → 세로 순서입니다.

// 포인터를 2차원 배열처럼 사용할 수 있음 자료형 **포인터이름 = malloc(sizeof(자료형 *) * 세로크기); // 배열의 세로 공간 메모리 할당 for (int i = 0; i < 세로크기; i++) // 세로 크기만큼 반복 { 포인터[i] = malloc(sizeof(자료형) * 가로크기); // 배열의 가로 공간 메모리 할당 } 포인터[세로인덱스][가로인덱스]; // 포인터 사용 // 포인터 해제 for (int i = 0; i < 세로 크기; i++) // 세로 크기만큼 반복 { free(포인터[i]); // 가로 공간 메모리 해제 } free(포인터); // 세로 공간 메모리 해제

2차원 배열처럼 사용하는 이중 포인터를 그림으로 나타내면 다음과 같은 모양이 됩니다.

 그림 2차원 배열처럼 사용하는 이중 포인터 

포인터를 3차원 배열처럼 사용하려면 삼중 포인터를 선언한 뒤 먼저 면 공간 메모리를 할당합니다. 반복문으로 세로 공간 메모리를 할당하면서 다시 반복문으로 가로 공간 메모리를 할당하면 됩니다. 해제할 때는 가로 → 세로 → 면 순서입니다.

// 포인터를 3차원 배열처럼 사용할 수 있음 자료형 ***포인터이름 = malloc(sizeof(자료형 **) * 높이); // 배열의 면 공간 메모리 할당 for (int depth = 0; depth < 높이; depth++) { 포인터[depth] = malloc(sizeof(자료형 *) * 세로크기); // 배열의 세로 공간 메모리 할당 for (int row = 0; row < 세로크기; row++) // 세로 크기만큼 반복 { 포인터[depth][row] = malloc(sizeof(자료형) * 가로크기); // 배열의 가로 공간 메모리 할당 } } 포인터[높이인덱스][세로인덱스][가로인덱스]; // 포인터 사용 // 포인터 해제 for (int depth = 0; depth < 높이; depth++) // 높이만큼 반복 { for (int row = 0; row < 세로크기; row++) // 세로 크기만큼 반복 { free(포인터[depth][row]); // 가로 공간 메모리 해제 } free(포인터[depth]); // 세로 공간 메모리 해제 } free(포인터); // 면 공간 메모리 해제

3차원 배열처럼 사용하는 삼중 포인터를 그림으로 표현하면 다음과 같은 모양이 됩니다.

 그림 3차원 배열처럼 사용하는 삼중 포인터 

 

 

 

핵심 정리 2: https://dojang.io/mod/page/view.php?id=699

 

C 언어 코딩 도장: 핵심 정리

문자열 문자열은 " "(큰따옴표)로 묶으며 char 포인터나 배열에 저장하여 사용합니다. char *s1 = "Hello, world!"; // char 포인터에 문자열의 메모리 주소를 저장 char s2[20] = "Hello, world!"; // char 배열에 문자열 저장 char s3[] = "Hello, world!"; // char 배열에 문자열 저장(배열의 크기 생략) 문자열을 인덱스로 접근하면 문자를 출력할 수 있습니다. // 문자열을 인

dojang.io

 

핵심 정리

문자열

문자열은 " "(큰따옴표)로 묶으며 char 포인터나 배열에 저장하여 사용합니다.

char *s1 = "Hello, world!"; // char 포인터에 문자열의 메모리 주소를 저장

char s2[20] = "Hello, world!"; // char 배열에 문자열 저장

char s3[] = "Hello, world!"; // char 배열에 문자열 저장(배열의 크기 생략)

 

문자열을 인덱스로 접근하면 문자를 출력할 수 있습니다.

// 문자열을 인덱스로 접근

printf("%c\n", s1[0]); // H

printf("%c\n", s2[4]); // o

이미 선언된 배열에는 문자열을 할당할 수 없습니다.

char s1[20]; s1 = "Hello, world"; // 컴파일 에러

문자열 포인터와 문자 배열의 요소 변경

문자열 포인터에 문자열 리터럴을 할당한 뒤에는 인덱스로 접근하여 문자(요소)를 변경할 수 없습니다(문자열 리터럴이 있는 메모리 주소는 읽기 전용). 하지만 문자 배열은 인덱스로 접근하여 문자를 변경할 수 있습니다(배열에 문자열이 복사됨).

char *s1 = "Hello"; // 문자열 포인터에 문자열 리터럴 할당(읽기 전용 메모리를 가리킴)

s1[0] = 'A'; // 실행 에러: 문자를 변경할 수 없음

char s2[10] = "Hello"; // 문자 배열에 문자열 리터럴 할당(배열에 문자열이 복사됨)

s1[0] = 'A'; // 문자를 변경할 수 있음

입력된 문자열을 배열 또는 포인터에 저장하기

입력된 문자열을 배열에 저장할 때는 scanf 함수를 사용하며 배열 앞에는 &를 붙이지 않습니다.

char s1[10]; // 크기가 10인 char형 배열을 선언 scanf("%s", s1); // 표준 입력을 받아서 배열 형태의 문자열에 저장

입력된 문자열을 포인터에 저장할 때도 포인터 앞에는 &를 붙이지 않습니다.

char *s1 = malloc(sizeof(char) * 10); // char 10개 크기만큼 동적 메모리 할당 scanf("%s", s1); // 표준 입력을 받아서 배열 형태의 문자열에 저장 free(s1); // 동적 메모리 해제

문자열과 서식 지정자

문자열은 서식 지정자 %s를 사용합니다.

char s1[20]; scanf("%s", s1); // %s로 문자열을 입력받음 printf("%s", s1); // %s로 문자열을 출력

scanf로 공백까지 포함하여 문자열을 입력받으려면 서식 지정자로 "%[^\n]s"를 사용합니다.

char s1[30]; scanf("%[^\n]s", s1); // 공백까지 포함하여 문자열 입력받기

문자열과 NULL

문자열은 문자열의 끝나는 지점을 알려주기 위해 마지막에 NULL(\0)이 붙습니다. 만약 배열이라면 NULL까지 들어가야 하므로 배열의 크기는 문자열의 길이보다 1이 더 커야 합니다.

char s1[6] = "Hello"; // 5글자 + NULL이므로 배열의 최소 크기는 6이상

 

 

핵심 정리 3: https://dojang.io/mod/page/view.php?id=733

 

C 언어 코딩 도장: 핵심 정리

sprintf(배열, 서식, 값); sprintf(배열, 서식, 값1, 값2, ...); sprintf(문자열포인터, 서식, 값); sprintf(문자열포인터, 서식, 값1, 값2, ...); stdio.h 서식을 지정하여 문자열을 생성합니다.

dojang.io

 

 

핵심 정리

문자열 함수

다음은 문자열 함수의 매개변수, 반환값과 설명을 정리한 표입니다.

 문자열 함수

함수헤더 파일설명

strlen(문자열포인터);
strlen(문자배열);
string.h 문자열의 길이를 구합니다(NULL은 포함하지 않음).
strcmp(문자열1, 문자열2); string.h 문자열1과 문자열2를 비교합니다(Windows).
  • -1: ASCII 코드 기준으로 문자열2가 클 때
  • 0: ASCII 코드 기준으로 두 문자열이 같을 때
  • 1: ASCII 코드 기존으로 문자열1이 클 때
    앞에 것이 크면 1, 뒤에 것이 크면 -1입니다.

리눅스와 OS X에서는 문자열1의 ASCII 코드값에서 문자열2의 ASCII 코드값을 뺀 결과를 반환합니다.
  • 반환값이 양수가 나오면 문자열1이 크고, 음수가 나오면 문자열2가 큼
  • ASCII 코드 기준으로 두 문자열이 같으면 0
strcpy(대상문자열, 원본문자열); string.h 문자열을 복사합니다.
strcat(최종문자열, 붙일문자열); string.h 문자열을 붙입니다.
sprintf(배열, 서식, 값);
sprintf(배열, 서식, 값1, 값2, ...);
sprintf(문자열포인터, 서식, 값);
sprintf(문자열포인터, 서식, 값1, 값2, ...);
stdio.h 서식을 지정하여 문자열을 생성합니다.





strchr(문자열, 검색할문자); string.h 문자열 안에서 문자로 검색합니다. 문자를 찾았으면
해당 문자부터 NULL 바로 앞까지의 문자열이 나옵니다
(해당 문자의 포인터 반환).
strrchr(문자열, 검색할문자); string.h 문자열의 뒤에서부터 문자로 검색합니다. 문자를
찾았으면 해당 문자부터 NULL 바로 앞까지의
문자열이 나옵니다(해당 문자의 포인터 반환).
strstr(대상문자열, 검색할문자열); string.h 문자열 안에서 문자열로 검색합니다. 문자열을
찾았으면 해당 문자열부터 NULL 바로 앞까지의
문자열이 나옵니다(해당 문자열의 포인터 반환).
strtok(대상문자열, 기준문자); string.h 문자를 기준으로 문자열을 자릅니다. 자른
문자열을 한 번에 얻을 수 없으므로 while
계속 반복 사용해야 합니다. 그리고 문자열을
자른 부분은 NULL로 바뀝니다.
atoi(문자열); stdlib.h 문자열을 정수로 변환합니다.
atof(문자열); stdlib.h 문자열을 실수로 변환합니다.
strtol(문자열, 끝포인터, 진법); stdlib.h 특정 진법으로 표기된 문자열을 정수로 변환
합니다. 정수 여러 개가 들어있는 문자열을
변환할 수 있습니다.
strtof(문자열, 끝포인터); stdlib.h 문자열을 실수로 변환합니다. 실수 여러 개가
들어있는 문자열을 변환할 수 있습니다.
sprintf(문자열,"%d", 정수);
sprintf(문자열,"%x", 정수);
sprintf(문자열,"%X", 정수);
stdio.h 정수를 문자열로 변환합니다.
  • %d: 10진수
  • %x: 16진수 소문자
  • %X: 16진수 대문자
sprintf(문자열,"%f", 실수); stdio.h 실수를 문자열로 변환합니다.

문자열 함수와 보안 경고

Visual Studio에서 scanf, strcpy, strcat, sprintf, strtok 등의 함수를 사용했을 때 보안 경고로 인한 컴파일 에러가 발생한다면 stdio.h, string.h 등의 헤더 파일 위에 #define _CRT_SECURE_NO_WARNINGS를 넣어줍니다.

#define _CRT_SECURE_NO_WARNINGS // 보안 경고로 인한 컴파일 에러 방지 #include <stdio.h> #include <string.h>

반응형