본문 바로가기

Algorithm/C프로그래밍

[4주차] 문자열

반응형

#10.1 문자열 개요

 

문자열(string)

  • 연속적으로 나열된 문자들의 묶음
  • 문자 배열을 사용해 저장

배열과 반복문을 사용하면 문자 단위로 초기화하고 출력하는 코드를 작성할 수 있지만 문자열을 이용하면 보다 더 쉽게 처리할 수 있다. 예를 들면, 아래의 두 코드는 같은 기능을 구현한 것이다.

1. 배열 + 반복문

char str[8] = {'H','e','l','l','o'};
int i;

for (i=0;i<5;i++)
	printf("%c",str[i]);

2. 문자열

char str[8] = "Hello";
printf("%s",str);

 

문자열 표현

  • 큰 따옴표로 감싼다.

 

문자열 입출력

  • 서식문자 %s

 

#10.2 문자열 저장 및 기본 입출력 (1)

 

문자열 표현: 큰 따옴표 사용

  • 공백 하나로 구성된 문자열: " "
  • 큰따옴표 하나로 구성된 문자열: "\""
  • 길이가 0인 문자열: ""

 

문자열 저장 및 초기화

  • 문자 배열에 문자열 저장
char str1[8] = "Hello" ; // 배열 크기 지정
char str2[] = "Hello" ; // 배열 크기 미지정. 초기화 값에 의해 크기 결정
  • 문자열로 초기화하는 것은 선언 시에만 가능!

 

널(null) 문자

  • 문자열의 끝을 의미하는 특수문자.
  • '\0'으로 표현한다.
  • 널 문자의 아스키 코드 값은 정수 0, 즉 '\0' == 0
  • 문자열을 처리하는 기준이 되는 매우 중요한 요소
  • 문자열은 항상 맨 마지막에 널 문자를 포함하고 있음
    • 문자 'A' -> A (1칸)
    • 문자열 "A" -> A, \0 (2칸)
    • 따라서 선언문을 초기화 할 때, 맨 뒤에 '\0'이 있어야한다.
// 둘이 같음
char str[] = "Hello";
char str[] = {'H','e','l','l','o','\0'};

* null과 정수 0의 차이: https://noirstar.tistory.com/16

 

문자 배열의 크기

  • 문자 배열에 문자열을 저장하기 위해서는 배열의 크기가 문자열의 길이보다 하나 더 커야 함

 

C언어에서 문자열의 기준

  • 널 문자까지의 문자들의 묶음을 지칭
    • 배열의 크기와는 관계 없음(배열은 단순히 저장공간 역할)
  • 문자열의 끝은 배열의 크기가 아니라 널 문자에 의해 결정
    • 입출력을 비록한 모든 문자열 처리의 기준

 

printf() 함수를 이용한 문자열 출력

  • 문자열을 하나의 단위로 취급
  • 서식 지정자: %s
  • 인자: 문자열의 시작 주소(보통 문자 배열의 이름)

 

출력 시 널 문자의 역할

  • 배열에서 초기화가 명시되지 않은 원소는 0('\0')으로 초기화 된다.
  • 널 문자는 화면에 공백처럼 출력되지만 공백 문자와는 다르다.
  • 인자로 전달된 주소의 문자부터 널 문자 전까지 출력(배열의 크기만큼 출력하는 것 아님) 
    • 뒤에 남는 것은 출력하지 않음

 


#10.3 문자열 저장 및 기본 입출력(2)

 

scanf() 함수를 이용한 문자열 입력

  • 서식 지정자: %s
  • 인자: 문자열을 저장할 시작 주소(보통 배열의 이름)

scanf의 %s 서식

  • 개행 문자, 공백 문자, 탭 문자 직전까지를 하나의 문자열로 인식
  • 마지막에 널 문자를 자동으로 추가

 

주의사항

  • 문자열(널 문자 포함)을 저장할 충분한 공간이 확보되어 있어야 함(모든 배열이 다 그럼)

 


#10.3 문자열과 포인터

 

문자형 포인터를 활용한 문자열 처리문

  • 문자형 포인터를 사용한 간단한 코드
char *str = "Hello"; // 초기화
printf("%s!!\n", str); // 출력

문자형 포인터 str을 선언하고, 문자열 "Hello"를 가리키도록 초기화한다. str에 주소가 저장되어 있으므로, printf의 %s 서식 이용해서 출력한다. 문자형 포인터를 배열처럼 사용할 수 있다.

 

pc[i] 값이 0이 아닌 다른 값을 가지면 다 참으로 판단이 되고 만약 0이 되면 거짓이 되는 것. (1은 참, 0은 거짓)

for (i=0; pc[i]; ++i) // pc[i] != '\0'
	if (pc[i] == 't')
    	cnt++;

 

문자 배열과 문자열 상수 비교

  • "Hello"는 문자열 상수로, 사용자 프로그램에서 변경 불가능
  • 반면, str은 사용자 변수로 값을 변경할 수 있음

 

문자 배열과 문자형 포인터 비교

세종대학교 고C 수업자료

 

주의

  • str이 포인터여서 문자 변경이 안 되는 것이 아니다.
  • str이 가리키는 영역의 성질에 따라 달라진다.
    • 변수 영역은 변경 가능하지만 상수 영역은 변경 불가하다.
// 1. 문자형 포인터에 문자열 상수 넣을 때는 앞으로 절대 바꿀 일 없을 때
char *str = "world"

// 2. 문자열을 배열에 넣을 때는 앞으로 변경할 수도 있을 때
char arr[6] = "Hello"
char *str = arr;
반응형

'Algorithm > C프로그래밍' 카테고리의 다른 글

[9주차] 동적 할당  (0) 2021.11.05
[5주차] 문자열  (0) 2021.09.29
[2주차] 포인터(3), (4)  (4) 2021.09.13
[1주차] 2. 포인터(2)  (0) 2021.09.13
[1주차] 1. Orientation + 포인터(1)  (0) 2021.08.31