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()는 처리 속도가 빠르다는 장점이 있따.