C

[C] 문자와 문자열①

c1oud9 2023. 5. 11. 13:29

 

 

01 문자와 문자열


 

문자와 문자열의 개념

 

  • 문자
    • 영어의 알파벳이나 한글의 한 글자를 작은 따옴표로 둘러싸서 'A'와 같이 표기
    • C언어에서 저장공간 크기 1byte인 자료형 char로 지원
    • 작은 따옴표에 의해 표기된 문자를 문자 상수

 

  • 문자열(string)
    • 문자의 모임인 일련의 문자
    • 일련의 문자 앞 뒤로 큰 따옴표로 둘러싸서 "java"로 표기
    • 큰 따옴표에 의해 표기된 물자열을 문자열 상수라 한다.
    • "A"처럼 문자 하나도 큰 따옴표로 둘러싸면 문자열 상수
    • 문자의 나열인 문자열은 'ABC'처럼 작은 따옴표로 둘러싸더라도 문자가 될 수 없으며 오류가 발생 

 

 

문자와 문자열의 선언

 

  • 문자
    • char형 변수에 문자를 저장

 

  • 문자열
    • 문자열을 저장하기 위한 자료형을 따로 제공하지 않는다.
    • 문자열을 저장하려면 문자의 모임인 '문자 배열'을 사용
    • 문자 배열을 선언하여 각각의 원소에 문자를 저장
    • 문자열의 마지막을 의미하는 NULL 문자 '\0'가 마지막에 저장되어야 한다.
    • 문자열이 저장되는 배열크기는 반드시 저장될 문자 수보다 1이 커야 한다.
    • C언어는 항상 NULL 문자를 문자열의 마지막으로 인식
    • 문자열의 마지막에 NULL 문자가 없다면 출력과 같은 문자열 처리에 문제가 발생

 

  • 배열 선언 시 초기화 방법
    • 중괄호 사용
    • 문자 하나 하나를 쉼표로 구분하여 입력하고 마지막 문자로 NULL인 '\0'을 삽입해야 한다.

 

  • 문자열을 선언하는 편리한 다른 방법
    • 배열 선언 시 저장할 큰 따옴표를 사용해 문자열 상수를 바로 대입
      • 배열 초기화 시 배열크기는 지정하지 않는 것이 더 편리
      • 지정한다면 마지막 문자인 '\0'을 고려해 실제 문자 수보다 1이 더 크게 배열크기를 지정해야 한다.
      • 지정한 배열크기가 (문자수+1)보다 크면 나머지 부분은 모두 '\0'문자로 채워진다.
      • 배열크기가 작으면 문자열 상수가 아닌 단순한 문자 배열이 되므로 문자열 출력 등에서 문제가 발생한다.
char ch = 'A';

char csharp[3];
csharp[0] = 'C'; csharp[1] = '#'; csharp[2] = '\0';

char java[] = {'J', 'A', 'V', 'A', '\0'};

char c[] = "C language";	# 크기를 생략하는 것이 간편
char c[11] = "C language";	# 크기 지정 시 (문자수+1)

char go[5] = "go";	# 크기가 (문자+1)보다 크면 나머지는 모두 '\0'로 채워짐

 

 

문자와 문자열 출력

  • 문자 출력 : 형식제어문자 %c
  • 문자열 출력 : 형식제어문자 %s (배열이름을 첫 주소를 인자로 사용하여 문자열 출력 가능)

 

문자열 구성하는 문자 참조

  • 문자열 상수를 문자 포인터에 저장하는 방식
  • 문자열을 구성하는 문자 하나 하나의 수정은 불가능
  • 문자열 출력은 함수 printf()에서 포인터 변수와 형식제어문자 %s로 간단히 처리
  • 문자열 상수를 저장하는 문자 포인터는 가리키는 문자열이 상수이므로 수정할 수 없다.

 

 

'\0' 문자에 의한 문자열 분리

  • 함수 printf()에서 %s는 문자 포인터가 가리키는 위치에서 NULL 문자까지를 하나의 문자열로 인식한다.
char c[] = "C C++ Java";
c[5] = '\0';
printf("%s\n%s\n", c, (c + 6));
C C++ 
Java
  • c[5]에 저장된 '\0'문자에 의해 c가 가리키는 문자열은 "C C++"까지가 된다.
  • 문자열은 시작 문자부터 '\0' 문자가 나올 때까지 하나의 문자열로 처리된다.
  • (c+6)로 문자열을 출력하면 "Java"가 출력된다.

 

 

 

다양한 문자 입출력

 

버퍼처리 함수 getchar()

  • 함수 getchar() : 문자의 입력에 사용
  • 함수 putchar() : 문자의 출력에 사용
  • 함수 getchar()는 라인 버퍼링(line buffering) 방식을 사용하므로 문자 하나를 입력해도 반응을 보이지 않다가 [enter] 키를 누르면 그제서야 이전에 입력한 문자마다 입력이 실행된다.
  • 입력한 문자는 임시 저장소인 버퍼(buffer)에 저장되었다가 [enter] 키를 만나면 함수는 버퍼에서 문자를 읽기 시작한다.
  • 라인 버퍼링 방식은 즉각적(interactive)인 입력을 요구하는 시스템에서는 사용이 불가능하다.

 

 

버퍼를 사용하지 않고 문자를 입력하는 함수 getche()

  • 버퍼를 사용하지 않으므로 문자 하나를 입력하면 바로 함수 getche()가 실행된다.
  • 함수 getche()에서 입력된 문자는 바로 모니터에 나타난다.
  • 함수는 버퍼를 사용하지 않고 문자 하나를 바로바로 입력할 수 있는 함수이다.
  • 함수를 이용하려면 헤더파일 conio.h를 삽입해야 한다.
char ch;
while ((ch = getche()) != 'q')
	putchar(ch);
iinnppuuttq
  • 입력 문자가 'q'가 아니면 함수 putchar()에 의하여 문자가 바로 출력
  • 함수 getche()에 의하여 입력된 문자도 보이고, 바로 putchar()에 의하여 출력한다.
  • 예를 들어 입력문자가 "inputq"라면 화면에는 "iinnppuuttq"가 보이게 된다.
  • 화면에 보이는 행이 표준입력과 표준출력이 번갈아 가면서 나오게 되므로 한 문자가 두 번씩 나오게 된다.

 

 

입력한 문자가 화면에 보이지 않는 함수 getch()

  • 문자 입력을 위한 함수 getch()는 입력한 문자가 화면에 보이지 않는 특성이 있다.
  • 입력된 문자를 출력함수로 따로 출력하지 않으면 입력문자가 화면에 보이지(echo) 않게 된다.
  • 함수 getch()도 버퍼를 사용하지 않는 문자 입력 함수이다.
  • 함수 getch()도 conio.h 파일에 함수원형이 정의되어 있어 사용하려면 conio.h를 삽입해야 한다.
함수 scanf("%c", &ch) getchar() getche()
_getche()
getch()
_getch()
헤더파일 stdio.h conio.h
버퍼 이용 버퍼 이용함 버퍼 이용 안함
반응 [enter] 키 눌러야 작동 문자 입력마다 반응
입력 문자의 표시(echo) 누르면 바로 표시 누르면 바로 표시 표시 안됨
입력문자 수정 가능 불가능

 

 

 

문자열 입력

 

문자배열 변수로 scanf()에서 입력

  • 함수 scanf()는 공백으로 구분되는 하나의 문자열을 입력 받을 수 있다.
  • 함수 scanf("%s", str)에서 형식제어문자 %s를 사용하여 문자열을 입력 받을 수 있다.

 

함수 printf()와 scnaf()는 다양한 입출력에 적합하며, 문자열 입출력 함수 puts()와 gets()는 처리 속도가 빠르다는 장점이 있따.