문타쿠, 공부하다.
[C언어 코딩 도장] Unit 39. 문자열 사용하기 본문
INTRO
C언어에서 문자 자료형인 char는 있지만 문자열을 저장하는 자료형은 없다.
-> char에 문자열을 저장하면 컴파일은 되지만 실행은 ㄴㄴ
39.1 문자와 문자열 포인터 알아보기
그래서 문자열은 어떻게 사용하는가?
-> 문자열은 변수에 직접 저장하지 않고 포인터를 이용해서 저장
-> 문자열은 char 포인터 형식으로 사용
#include <stdio.h>
int main(void)
{
char c1 = 'a'; // 변수 c1에 문자 'a' 저장
printf("%c\n\n", c1);
char* s1 = "Hello"; // 포인터 변수 s1에 문자열 "Hello"의 주소 저장
printf("%p\n", s1); // 포인터 변수 s1이 가지고 있는 주소 = 문자열 "Hello"의 주소
printf("%s\n", s1); // 포인터 변수 s1이 가지고 있는 주소의 문자열 = "Hello"
printf("%p\n", &s1); // 포인터 변수 s1의 주소
return 0;
}
- 문자(a)는 변수 c1에 저장되지만, 포인터 변수 s1에는 문자열 리터럴(Hello)이 있는 곳의 메모리 주소만 저장된다.
- 문자열 리터럴(Hello)이 있는 메모리 주소는 읽기 전용이므로 다른 문자열을 덮어쓸 수 없다.
- C언어의 문자열 마지막에는 항상 널 문자(NULL=\0)가 붙는다.
- 널 문자(NULL=\0)는 문자열의 끝을 나타내며, printf는 문자열을 출력할 때 문자열을 계속 출력하다가 NULL을 만나면 출력을 종료한다.
39.2 문자열 포인터에서 인덱스로 문자에 접근하기
#include <stdio.h>
int main(void)
{
char* s1 = "Hello";
printf("%c\n", s1[0]);
printf("%c\n", s1[1]);
printf("%c\n", s1[2]);
printf("%c\n", s1[3]);
printf("%c\n", s1[4]);
printf("%c\n", s1[5]); // NULL(\0) 출력 -> 화면에 안보임
return 0;
}
문자열 리터럴이 있는 메모리 주소는 읽기 전용이기 때문에, 문자열 포인터는 아래처럼 인덱스로 접근하여 문자를 할당하면 안된다.
#include <stdio.h>
int main(void)
{
char* s1 = "Hello";
s1[0] = 'A';
printf("%c\n", s1[0]);
return 0;
}
-> 오류발생
39.3 배열 형태로 문자열 선언하기
문자열은 char 배열에 저장할 수도 있다.
- 배열을 선언한 즉시 문자열로 초기화하기
- 배열의 크기는 할당한 문자열보다 크게 지정해야하며, 마지막에 NULL 값이 들어가야 하는 것도 생각하기
- 배열의 최소 크기 = 할당한 글자의 개수 + 1(NULL)
#include <stdio.h>
int main(void)
{
char s1[10] = "Hello"; // 최소 크기 = 6
printf("%s\n", s1);
return 0;
}
-> 아래와 같이 배열을 미리 선언해 놓고 문자열을 나중에 할당할 수 없음(컴파일 에러 발생)
#include <stdio.h>
int main(void)
{
char s1[10];
s1 = "Hello";
printf("%s\n", s1);
return 0;
}
-> 정 할당하고 싶으면 배열의 요소에 문자를 하나하나 집어넣어야 함
s1[0] = 'H';
s1[1] = 'e';
s1[2] = 'l';
s1[3] = 'l';
s1[4] = 'o';
-> 아래와 같이 문자 배열을 선언하면서 문자열을 바로 할당할 때는 배열의 크기를 생략할 수 있다.
-> 배열의 크기는 할당되는 문자열의 문자 개수 및 NULL 값을 생각하여 자동으로 지정됨
#include <stdio.h>
int main(void)
{
char s1[] = "Hello";
printf("%s\n", s1);
return 0;
}
39.4 배열 형태의 문자열에서 인덱스로 문자에 접근하기
#include <stdio.h>
int main(void)
{
char s1[10] = "Hello";
printf("%c\n", s1[0]);
printf("%c\n", s1[1]);
printf("%c\n", s1[2]);
printf("%c\n", s1[3]);
printf("%c\n", s1[4]);
printf("%c\n", s1[5]); // NULL(\0) 출력 -> 화면에 안보임
return 0;
}
#include <stdio.h>
int main(void)
{
char s1[10] = "Hello";
s1[0] = 'A';
printf("%s\n", s1);
return 0;
}
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 40. 입력 값을 문자열에 저장하기 (0) | 2023.09.24 |
---|---|
[C언어 코딩 도장] Unit 39. 연습문제 및 심사문제 (0) | 2023.09.24 |
[C언어 코딩 도장] Unit 38. 연습문제 및 심사문제 (0) | 2023.09.23 |
[C언어 코딩 도장] Unit 38. 포인터와 배열 응용하기 (0) | 2023.09.23 |
[C언어 코딩 도장] Unit 37. 연습문제 및 심사문제 (0) | 2023.09.19 |