Unit 39. 문자열 사용하기
39.1 문자와 문자열 포인터 알아보기
문자열은 char 포인터 형식으로 사용한다.
- char *변수이름 = "문자열";
#include <stdio.h>
int main()
{
char c1 = 'a'; // 변수에 문자 'a' 저장
char *s1 = "Hello"; // 포인터에 문자열 "Hello"의 주소 저장
printf("%c\n", c1); // a: %c로 문자 출력
printf("%s\n", s1); // Hello: %s로 문자열 출력
return 0;
}
문자는 1바이트 크기의 char에 저장할 수 있지만 문자열은 크기가 1바이트를 넘어서므로 char에 저장할 수 없다. 따라서 문자열은 변수에 직접 저장하지 않고 포인터를 이용해서 저장한다.
즉, 문자는 변수 c1 안에 그대로 저장되지만 문자열 리터럴이 변수 s1안에 저장되지 않고, 문자열이 있는 곳의 메모리 주소만 저장된다.
그리고 메모리 주소를 보고 문자열이 저장된 위치로 이동하게 된다.
※ C 언어의 문자열은 마지막에 항상 널 문자(NULL)가 붙는다. NULL은 0으로도 표현할 수 있으며 문자열의 끝을 나타낸다. 그래서 printf는 문자열을 출력할 때 문자열을 계속 출력하다가 NULL에서 출력을 끝낸다.
39.2 문자열 포인터에서 인덱스로 문자에 접근하기
포인터도 [ ] (대괄호)를 사용하여 인덱스로 접근할 수 있으니 이번에는 문자열에서 문자를 하나씩 출력해보겠다.
#include <stdio.h>
int main()
{
char *s1 = "Hello"; // 포인터에 문자열 Hello의 주소 저장
printf("%c\n", s1[1]); // e: 인덱스 1(두 번째)의 문자 출력
printf("%c\n", s1[4]); // o: 인덱스 4(다섯 번째)의 문자 출력
printf("%c\n", s1[5]); // 문자열 맨 뒤의 NULL(\0) 출력. NULL은 화면에 표시되지 않음
return 0;
}
s1[1]처럼 문자열 포인터를 인덱스로 접근했고, printf에서 서식 지정자 %c로 문자를 출력하였다. 이렇게 문자열 포인터를 인덱스로 접근하면 char와 같기 때문에 %c로 출력할 수 있다.
※ 단, 문자열 포인터는 인덱스로 접근하여 문자를 할당하면 안된다. 왜냐하면 문자열 리터럴이 있는 메모리 주소는 읽기 전용이기 때문이다.
39.3 배열 형태로 문자열 선언하기
문자열은 문자(char) 배열에 저장할 수도 있다.
- char 배열이름[크기] = "문자열";
#include <stdio.h>
int main()
{
char s1[10] = "Hello"; // 크기가 10인 char형 배열을 선언하고 문자열 할당
printf("%s\n", s1); // Hello: %s로 문자열 출력
return 0;
}
char s1[10] = "Hello";와 같이 크기가 10인 char형 배열(문자 배열)을 선언한 뒤 문자열을 할당했다. 그리고 printf에서 서식 지정자 %s로 배열을 출력해보면 배열에 저장된 문자열이 출력된다.
문자열 리터럴을 포인터에 할당하는 방식과는 달리 문자열을 배열에 저장하는 방식은 배열 요소 하나 하나에 문자가 저장된다. 그리고 여기서도 문자열의 맨 뒤에 NULL이 들어간다.
※ 배열로 문자열을 사용할 때 배열을 선언한 즉시 문자열로 초기화해야 한다. 배열을 미리 선언해놓고 문자열을 나중에 할당할 수는 없다.
+ 문자 배열을 선언하면서 문자열을 바로 할당할 때는 배열의 크기를 생략할 수 있다. 이때, 배열의 크기는 할당되는 문자열의 문자 개수에 맞춰 자동으로 지정된다.
39.4 배열 형태의 문자열에서 인덱스로 문자에 접근하기
#include <stdio.h>
int main()
{
char s1[10] = "Hello"; // 크기가 10인 char형 배열을 선언하고 문자열 할당
printf("%c\n", s1[1]); // e: 인덱스 1(두 번째)의 문자 출력
printf("%c\n", s1[4]); // o: 인덱스 4(다섯 번째)의 문자 출력
printf("%c\n", s1[5]); // 문자열 맨 뒤의 NULL(\0) 출력. NULL은 화면에 표시되지 않음
return 0;
}
배열에 문자열을 저장한다면 당연히 인덱스로 접근할 수 있다.
또 배열 형태의 문자열은 문자열 포인터와 달리 인덱스로 접근하여 문자를 할당할 수 있다.
Unit 40. 입력 값을 문자열에 저장하기
40.1 입력 값을 배열 형태의 문자열에 저장하기
scanf 함수에서 서식 지정자로 %s를 사용하면 입력 값을 배열 형태의 문자열에 저장할 수 있다.
- scanf("%s", 배열);
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
char s1[10]; // 크기가 10인 char형 배열을 선언
printf("문자열을 입력하세요: ");
scanf("%s", s1); // 표준 입력을 받아서 배열 형태의 문자열에 저장
printf("%s\n", s1); // 문자열의 내용을 출력
return 0;
}
scanf("%s", s1);과 같이 scanf 함수에 서식 지정자로 %s를 넣어서 문자열을 입력받을 수 있도록 설정한다. 그리고 두 번째 매개 변수에는 입력 값을 저장할 배열을 넣다. 단, 일반 변수와는 달리 배열 앞에는 &를 붙이지 않는다(배열도 포인터처럼 주소를 담고 있으므로).
scanf에서 서식 지정자 %s로 문자열을 저장할 때 입력된 문자열에 공백이 있다면 배열에는 공백 직전까지만 저장된다.
※ 공백까지 포함하여 입력받기
scanf 함수에서 서식 지정자를 "%[^\n]s"와 같이 지정하면 공백까지 포함하여 문자열을 입력받을 수 있다.
40.2 입력 값을 문자열 포인터에 저장하기
문자열 리터럴의 경우 읽기만 할 수 있고, 쓰기가 막혀있다. 따라서 문자열 리터럴의 주소가 할당된 포인터는 scanf 함수에서 사용할 수 없다.
입력 값을 문자열 포인터에 저장하려면 문자열이 들어갈 공간을 따로 마련해야 된다. 따라서 다음과 같이 malloc 함수로 메모리를 할당한 뒤 문자열을 저장한다.
- scanf("%s", 문자열포인터);
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
char *s1 = malloc(sizeof(char) * 10); // char 10개 크기만큼 동적 메모리 할당
printf("문자열을 입력하세요: ");
scanf("%s", s1); // 표준 입력을 받아서 메모리가 할당된 문자열 포인터에 저장
printf("%s\n", s1); // 문자열의 내용을 출력
free(s1); // 동적 메모리 해제
return 0;
}
char *s1 = malloc(sizeof(char) * 10);처럼 char 10개 크기만큼 동적으로 메모리를 할당했다. 이렇게 하면 scanf 함수로 입력 값을 문자열 포인터 s1에 저장할 수 있다. 그리고 scanf를 사용할 때 s1은 포인터이므로 &를 붙이지 않고 그대로 넣는다.
40.3 문자열을 여러 개 입력받기
이번에는 공백으로 구분된 문자열 두 개를 입력받아보겠다.
- scanf("%s %s ...", 배열1, 배열2, ...);
- scanf("%s %s ...", 문자열포인터1, 문자열포인터2, ...);
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main()
{
char s1[10]; // 크기가 10인 char형 배열을 선언
char s2[10]; // 크기가 10인 char형 배열을 선언
printf("문자열을 두 개 입력하세요: ");
scanf("%s %s", s1, s2); // 표준 입력에서 공백으로 구분된 문자열 두 개를 입력받음
printf("%s\n", s1); // s1의 내용을 출력
printf("%s\n", s2); // s2의 내용을 출력
return 0;
}
먼저 문자열 두 개를 저장하기 위한 공간을 선언한다. 여기서는 s1, s2 배열을 선언했다.
이제 scanf("%s %s", s1, s2);와 같이 서식 지정자로 %s를 두 개 넣어준다. 그리고 %s에 해당하는 문자열이 저장될 배열을 두 개를 넣어주면 공백으로 구분된 문자열을 입력받을 수 있다.
'Programming Languages > C' 카테고리의 다른 글
[P4C] C언어 코딩 도장 : UNIT 41 ~ UNIT 44 (0) | 2021.03.14 |
---|---|
[P4C] C언어 코딩 도장 : 문제 풀이 5 (0) | 2021.03.14 |
[P4C] CodeUp 1810 : (포인터) 부분 문자열 (0) | 2021.03.05 |
[P4C] CodeUp 1581 : swap 함수 만들기 (Call by Reference) (0) | 2021.03.05 |
[P4C] C언어 코딩 도장 : 문제 풀이 4 (0) | 2021.03.05 |