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