본문 바로가기
프로그래밍 언어/C, C++의 기본적인 설명

[C/C++] 문자/문자열 입출력

by UltraLowTemp-Physics 2021. 8. 25.
728x90

프로그램을 사용하는 사용자는 입출력 함수를 통해서 프로그램과 정보를 주고 받을 수 있다. 
C에서 흔히 사용하는 입출력 함수의 예는 아래와 같다; printf(), scanf(), getchar(), putchar(). 


1. 단일 문자 입출력 1: getchar()/putchar() 

설명
getchar() - 헤더파일: stdio.h
- 한 문자를 입력하여 반환
- 파일의 끝에 도달했을 때, EOF값을 반환 
putchar() - 헤더파일: stdio.h
- 한 문자를 출력 
ex) putchar(ch) 
변수 ch에 저장된 문자 하나를 출력 

Note: getchar()와 putchar()의 경우 진짜 함수가 아니며, 전처리기 매크로에 의해서 정의됨 

예시) 
- 키보드로 입력한 문자를 바로 출력 
- EOF 문자(파일끝)를 만나면 프로그램 종료
- 입력의 에코*'의 예시 (버퍼를 사용하지 않는 입력 또는 직접 입력) 

#include <stdio.h>

int main(void){
	char ch;
    
    while ((ch = getchar()) != EOF){
    	putchar()
    }

	return 0
}

프로그램을 종료하기 위해선, "<Ctrl>+Z"를 입력해야 함

* 버퍼

1) 버퍼란: 직접 입력과 다르게 입력 문자들을 버퍼라는 임시 기억 장소에 저장을 함 
2) 버퍼를 사용하는 이유? 
   - 문자들을 묶어서 전달하는 것이 하나씩 전달하는 것보다 시간을 적게 소모함 
   - 잘못 타이핑했을 경우, 키보드 기능을 이용항 실수를 고칠 수 있음 
3) 버퍼를 사용하지 않고 직접 입력을 사용하는 경우? 
   - 게임과 같이 키를 누르는 즉시 실행이 되어야 하는 경우
4) 버퍼링의 두 가지 방법: 완전 버퍼링, 라인 버퍼링 
   a. 완전 버퍼링
     - 버퍼가 가득 찼을 때, 버퍼의 내용이 출력과 동시에 버퍼가 비워짐 
     - 일반적으로 파일 입력에서 많이 일어남
     - 일반적인 버퍼의 크기는 512 바이트 또는 4096 바이트 
   b. 라인 버퍼링
     - 개행 문자가 나타날 때마다 버퍼가 비워짐 
     - 일반적인 키보드 입력은 라인 버퍼링

* 파일의 끝 (EOF)

컴퓨터 운영체제는 각각의 파일이 어디에서 시작하고 어디에서 끝나는지 알려주는 방법이 필요함 
   a. 파일의 끝을 알려주는 방법 1: 파일의 끝을 알려주는 문자(EOF)를 넣음 
     - 운영체제는 파일의 끝을 표시하기 위해 "Ctrl+Z" 문자를 사용할 수 있음 
   b. 파일의 끝을 알려주는 방법 2: 운영체제가 파일의 크기에 대한 정보를 저장하는 것 

* getchar()와 scanf()의 혼합 사용

#include <stdio.h>

void display(char cr, int lines, int width)

int main(void){
    int ch;         /* NOTE 1: 출력할 문자*/
    int rows, cols; /* 행의 수와 열의 수*/
	printf("문자 하나와 두 개의 정수를 입력하시오.\n");
    while((ch = getchar()) != '\n'){
    	if (scanf("%d %d", &rows, &cols) != 2) break;
        display(ch, rows, cols);
        while(getchar() != '\n') continue; /* NOTE 2 */
        printf("또 다른 문자와 두 개의 정수를 입력하시오.\n");
        printf("끝내려면 그냥 Enter 키를 누르시오.\n");
    }
    printf("Bye\n");
    
    return 0;
}

void display(char cr, int lines, int width){
	int row, col;
    
    for (row = 1 ; row <= lines; row ++){
    	for (col = 1 ; col <= width; col ++) putchar(cr);
    	putchar('\n');
    }
}
}

NOTE 1: EOF 검사를 할 수 있도록 문자를 int형으로 읽으나, display 함수에는 char 형으로 전달 
NOTE 2: scanf() 함수의 경우
   - 수를 읽을 때, 화이트 스페이스, 탭, 개행 문자는 건너뜀
   - scanf()는 개행 문자를 입력 큐에 남겨둠 
   - 따라서, 해당 개행문자를 처리할 수 있어야 함 
   - scanf()의 리턴값: 성공적으로 읽은 항목 수를 리턴함 

 

 

문자열 입출력

1. 문자열 입력 

문자열을 읽기 위해선 다음을 고려해야한다. 
 (1) 문자열이 저장될 수 있는 공간을 할당
   - 방법 1: char형 데이터의 배열을 선언하여 문자열의 최대 크기를 명시적으로 제한
   - 방법 2: malloc()와 같은 메모리를 할당하는 C 라이브러리 함수를 이용 
 (2) 문자열을 읽는 입력함수를 사용 
   - C에서는 문자열을 읽기 위해 다음과 같은 함수들을 사용할 수 있다; gets(), fgets(), scanf()

1) gets() 함수 
- 대화식 프로그램에서 유용하게 사용될 수 있음 
- 사용자 시스템의 표준 입력 장치로부터 하나의 문자열을 얻는 함수 
  -- gets() 함수가 읽는 문자열은 사용자가 "Enter"를 눌렀을 때 생성되는 개행문자(\n)까지 도달할 때까지의 문자들을 읽음 
  -- 리턴값:
     --- 개행문자를 널문자로 치환 후 해당 문자열을 리턴함 (char 형이 가리키는 포인터 값을 리턴함)
     --- 만일 뭔가 잘못되거나 파일의 끝을 만나는 경우에는 NULL(NULL pointer)을 리턴함
 - 파일의 끝
           
- syntax: gets(<char_adress>) 
  -- char형 배열의 주소를 전달인자로 사용 

 

 

 

 

 

 

728x90

댓글