차곡차곡

[C/L] 문자열 본문

Language/C

[C/L] 문자열

sohy 2022. 12. 11. 11:58

문자열

문자형 변수는 하나의 문자만을 저장할 수 있다. 문자열은 여러 개의 문자로 이루어져 있으므로 문자형 배열로 저장이 가능하다.

char str[6] = "Hello";

여기서 "Hello"에는 5개의 문자만 있는데 배열의 크기가 6인 이유는, C에서는 문자열의 끝이 반드시 NULL 문자로 끝나야 하기 때문이다. "Hello"를 저장한다고 하면 문자 배열에는 'H', 'e', 'l', 'l', 'o', '\0' 이 저장된다. 문자열의 끝을 표시해주는 이유는, 정수형 변수의 경우 사용되는 바이트의 개수가 항상 일정하기 때문에 끝을 표시하지 않아도 되지만, 문자열의 경우 사용되지 않은 바이트에 쓰레기 값이 들어가게 되기 때문이다. 문자열을 저장하기 위해 10바이트 크기의 배열을 잡았다고 가정했을 때, "Hello"를 저장하면 나머지 5바이트에는 쓰레기 값이 들어가게 되는 것이다. 컴퓨터는 어디까지가 의미 있는 문자열인지 알 수 없다.

 

문자열 초기화

1. 배열 요소 값들을 중괄호 안에 넣어주는 방법 (마지막 요소에는 반드시 NULL 문자를 넣어주어야 한다.)

char str[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };

2. 문자열 상수 사용 (컴파일러가 자동으로 문자열 끝에 NULL 문자를 추가한다.)

char str[6] = "Hello";

+ 배열의 크기를 지정하지 않을 경우 컴파일러가 문자의 개수에 맞춰 자동으로 배열의 크기를 설정한다.

char str[] = "Hello";

 

문자 입출력

  • getchar() : 하나의 문자를 받아서 반환한다. 버퍼를 사용한다.
  • putchar() : 하나의 문자를 받아서 출력한다.
  • getch() : 하나의 문자를 받아서 반환한다. 버퍼를 사용하지 않는다.
  • putch() : 하나의  문자를 받아서 출력한다.

getchar()는 문자를 입력하고 엔터키를 누르기 전까지 글자들이 프로그램으로 보내지지 않는다. getchar()는 버퍼를 사용하기 때문이다. 또한 엔터키도 줄바꿈 문자 '\n'으로 프로그램에 전달된다. 반면에 getch()는 버퍼를 사용하지 않아서 사용자가 키를 누르면 바로 프로그램으로 전달된다.

#include <stdio.h>

int main(void)
{
  int ch;   // 정수형에 주의
  ch = getchar();   // 첫 번째 문자를 입력받는다
  putchar(ch);   // 문자를 출력한다
  
  return 0;
 }

** getchar 함수 반환형이 int형인 이유?

getchar 함수가 문자 이외의 값도 반환하기 때문이다. 문자의 입력을 끝내기 위해 Ctrl+Z(EOF) 키를 누르면 -1을 반환하는데. 이 값을 문자와 정확히 구분하기 위해서는 반환형으로 int형을 사용해야 한다. 

 

문자열 입출력

  • scanf("%s", s) : 문자열을 읽어서 배열 s[]에 저장 (하나의 단어만 입력 받는다.)
  • printf("%s", s) : 배열 s[]에 저장되어 있는 문자열 출력
  • gets_s(char s[], int length) : 한 줄의 문자열을 읽어서 배열 s[]에 저장
  • puts(char s[]) : 배열 s[]에 저장되어 있는 한 줄의 문자열 출력
#include <stdio.h>

int main(void)
{
  char name[100];
  char address[100];
  
  printf("이름이 어떻게 되시나요? ");
  gets_s(name, 99);
  // gets(name);
  
  printf("어디 사시나요? ");
  gets_s(address, 99);
  // gets(address);
  
  printf("안녕하세요, %s에 사는 %s씨.\n", address, name);
  
  return 0;
}

 

'Language > C' 카테고리의 다른 글

[C/L] 포인터  (1) 2022.11.05
[C/L] 수식과 연산자  (0) 2022.07.20
[C/L] 변수와 자료형  (0) 2022.07.09
[C/L] C언어 기초  (4) 2022.07.03
Comments