본문 바로가기

programming language/C 언어

열혈 ( C ) chapter 21 정리노트 1

chapter 21-1

 

콘솔 입출력을 위한 '입력 스트림'과 '출력 스트림'은 프로그램이 실행되면 자동으로 생성되고, 프로그램이 종료되면 자동으로 소멸되는 스트림이다. 즉, 이 둘은 '표준 스트림' 이라고 한다.

stdin 표준 입력 스트림 키보드 대상으로 입력
stdout 표준 출력 스트림 모니터 대상으로 출력
stderr 표준 에러 스트림 모니터 대상으로 출력

 

스트림이란? 한 방향으로 흐르는 데이터 흐름을 뜻한다. 즉 단 방향으로만 데이터의 전송이 이뤄진다는 뜻이 담겨있다. 실제로 입력 스트림과 출력 스트림이 구분되어, 한 방향으로만 데이터의 흐름을 유지하고 있다.

 

chapter 21-2

 

문자 출력 함수: putchar, fputc (모니터로 하나의 문자를 출력할 때..사용하는 두 함수)

#include<stdio.h>
int putchar(int c);
int fputc(int c, FILE * stream);

putchar 함수는 인자로 전달된 문자 정보를 stdout으로 표현되는 표준 출력 스트림으로 전송하는 함수이다.

문자를 전송한다는 측면에서는 fputc 함수도 putchar함수와 동일하지만, fputc 함수는 문자를 전송할 스트림을 지정할 수 있다. fputc함수의 두번째 매개변수 stream은 문자를 출력할 스트림의 지정에 사용된다.

 

문자 입력 함수: getchar , fgetc

#include<stdio.h>
int getchar(void);
int fgetc(FILE * stream);

getchar함수는 stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력받아서 반환하는 함수이다.

따라서, 키보드로부터 하나의 문자를 입력받는 함수라 할 수 있다. fgetc함수도 하나의 문자를 입력받는 함수 이지만, 문자를 입력받을 스트림을 지정할 수 있다. 

 

문자 입출력에서의 EOF

#include<stdio.h>

int main(void)
{
	int ch;

	while (1)
	{
		ch = getchar();
		if (ch == EOF)
			break;
		putchar(ch);
	}
	return 0;
}

프로그램의 종료를 원하면 CTRL + Z 를 입력하면 된다. 

EOF는 파일의 끝을 표현하기 위해서 정의해 놓은 상수이고, 파일을 대상으로 fgetc 함수가 호출되고 그 결과로 EOF가 반환되면, 이것은 파일의 끝에 도달해 더 이상 읽을 내용이 없다는 뜻이다.

 

그렇다면, 키보드를 대상으로 하는 getchar함수와 fgetc함수는 언제 EOF를 반환할까? 

-함수 호출의 실패

- window에서  CTRL + Z키 LInux에서  CTRL + D키가 입력되는 경우이다.

 

<참고>

위 예제(코드)에서는 getchar함수가 호출된다고 해서 하나의 문자만 입력하려고 노력하지 않아도 된다. 문자가 아닌 공백을 포함하는 문장을 입력해도 되는데, 문장이 입력되면 문장을 구성하는 문자의 수만큼 getchar함수가 호출되면서 모든 문자를 읽어 들이기 때문이다.

 

문제 21-1

 

<내 풀이>

#include<stdio.h>
int main(void)
{
	int ch;
	ch = getchar();
	if ('A'<=ch && ch<= 'Z')
	{
		ch += 32;
		putchar(ch);
	}
	else if ('a'<=ch && ch<='z')
	{
		ch -= 32;
		putchar(ch);
	}
	else
	{
		printf("Error");
	}
	return 0;
}

소문자 a의 십진수 값은 97, 대문자 A의 십진수값은 65이다. 즉 두 문자의 차는 32이다. 위의 코드는 이를 이용해서 

ch가 대문자인지 소문자인지를 비교 후 대문자이면 32를 더해 소문자로 출력을 해주고, 소문자이면 32를 빼주어 대문자로 출력을 하게끔 구현을 하였다.

 

<교재 풀이>

#include<stdio.h>
int ConvCase(int ch)
{
	int diff = 'a' - 'A';
	if (ch >= 'A' && ch <= 'Z')
		return ch + diff;
	else if (ch >= 'a' && ch <= 'z')
		return ch - diff;
	else
		return -1;
}
int main(void)
{
	int ch;
	printf("문자 입력: ");
	ch = getchar(); //문자 입력
	ch = ConvCase(ch); //문자 변환
	if (ch == -1)
	{
		puts("범위를 벗어난 입력입니다");
		return -1;
	}
	putchar(ch); //형변환된 문자 출력
	return 0;
}

입력받은 문자를 대 소 문자로 바꾸어주는 프로그램에 해당하는 함수를 따로 만들어 주었고, -1을 반환한다는 것은 보통 프로그램의 비정상적인 종료를 뜻하는데, 여기 함수에서  return -1; 의 코드를 작성한 이유는 프로그램 전체의 비정상적인 종료를 의미한다기보다는 이 함수 자체에서 비정상적 에러를 표현하기 위함이라 보면 될 것 같다. 그리고 main함수에서의 return -1;은 main함수를 호출한 영역(운영 체제)에 -1을 전달한다고 보면 되는데, 이는 프로그램의 비정상적인 종료를 뜻한다.