핵심 정리

문자열

문자열은 " "(큰따옴표)로 묶으며 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이상