문자입출력

getchar, putchar

 

 

사용 방법

특징 : 

getchar() : 표준 입력 스트림으로부터 한 문자를 입력받아서 반환해주는 함수이다.

putchar() : 표준 입력 스트림으로 한 문자를 출력하는 함수이다.

입력버퍼를 사용한다.

값을 입력하면 enter(\n)가 입력될 때까지 값들을 1바이트씩 키보드버퍼에 저장한다.

\n(엔터)와 공백도 문자로 인식한다.

 

ch = getchar(); 이 문장이 실행되면, 만약 abcd\n를 입력했을 때, 키보드 버퍼에 abcd\n가 저장되고

putchar에서 a가 출력된다. bcd\n은 아직 키보드 버퍼에 남아있다.

 

 

 

 

 

[주의]

#include <stdio.h>

void qq();


void main()
{
	qq();
}

void qq()
{
	char ch, ch2;

	printf("문자 입력 :\n");
	ch = getchar();
	ch2 = getchar();

	printf("결과 출력 :");
	printf("%c %c", ch, ch2);
}

 

만약 ch = getchar();가 실행되었을 때, a를 입력하고 엔터를 입력한다면, 

ch에는 a가 들어가고 ch2에는 \n가 들어가게 되어

결과에서는 a밖에 출력되지 않는다.

 

이것을 해결하려면 아래 코드처럼 한 문장을 추가하면 된다.

#include <stdio.h>

void qq();


void main()
{
	qq();
}

void qq()
{
	char ch, ch2;

	printf("문자 입력 :\n");
	ch = getchar(); // 이 곳에서 a\n를 입력했을 때, ch엔 a가 저장된다.
    	getchar();  //★★★추가된 문장★★★ 이 곳에서 \n를 가져간다.
	ch2 = getchar(); //이 곳에서는 문자 하나를 받을 수 있게 된다.

	printf("결과 출력 :");
	printf("%c %c", ch, ch2);
}

 

 

===

 

 

_getche()

사용 방법

#include <stdio.h>
#include <conio.h> //_getche()함수는 conio.h에 정의되어 있음!!


void qq();


void main()
{
	qq();
}

void qq()
{
	char ch;

	printf("문자 입력 :\n");
	ch = _getche();


	printf("결과 출력 :");
	printf("%c", ch);
}

 

 

특징 : 

키보드 버퍼를 사용하지 않아 getchar()함수보다 속도가 빠르다.

입력중 엔터를 누르면 입력이 종료된다.

공백도 입력된다.

 

 

위 코드에서 ch = _getche();가 실행되었을 때, a를 입력하자마자 내가 입력한 a가 보이는 동시에 a가 출력된다.

 

※ TMI Point!

 

getch 함수는 비표준 함수이기 때문에 Visual Studio 2015(2019)에서 사용하면 컴파일 에러가 발생합니다.

 

따라서 #define _CRT_NONSTDC_NO_WARNINGS(매크로)를 지정하여 컴파일 에러가 발생하지 않도록 만듭니다.

 

만약 매크로를 지정하지 않으려면 getch 대신 _getch 함수를 사용하면 됩니다.

출처 : C 언어 코딩 도장: 85.18 conio.h 함수 사용하기 (dojang.io)

 

 

===

_getch();

 

getch()는 한 가지만 빼고 getche()와 같다.

 

getch()는 내가 입력한 문자가 보이지만, getch()는 내가 입력한 문자가 보이지 않고 입력하자마자 바로 출력된다.

키보드를 눌렀다가 떼는 동시에 그 값을 가져간다.

 

 

 

 

 

===

문자열 입출력

gets_s() [_s를 붙이면 보안 경고 없이 사용 가능] 과 puts()

 

gets_s()는 표준 입력 스트림으로부터 문자열을 입력받아서 반환해주는 함수이다.

문자들을 읽어들이다가 개행 문자(\n)를 만나면 개행문자 대신 null문자(\0)를 붙여서 프로그램에게 반환한다.

 

puts()는 표준 출력 스트림으로 문자열을 출력하는 함수이다.

문자열을 출력하다가 null(\0)문자를 만나면 null문자대신 개행문자를 붙이고 출력을 끝낸다.

#include <stdio.h>


void qq();


void main()
{
	qq();
}

void qq()
{
	char ch[20]; //ch배열에 20byte공간을 만듬

	printf("문자 입력 :\n");
	gets_s(ch, sizeof(ch)); //문자열을 입력하면 ch배열에 문자열 저장


	printf("\n결과 출력 :");
	printf("%s", ch); //문자열을 출력하는 형식지정자 %s
}

gets_s(ch, sizeof(ch)); 이 문장이 실행되었을 때, abcd를 입력했다고 한다면

 

abcd\n를 입력한 것과 마찬가지인데, 이때 \n을 null로 처리하여 문자열의 끝을 만들어주고, 출력을 한다.

 

 

 

===

puts() (문자열 출력함수)

#include <stdio.h>
#include <conio.h>


void qq();


void main()
{
	qq();
}

void qq()
{
	char ch[20];

	printf("문자 입력 :\n");
	gets_s(ch, sizeof(ch));


	printf("\n결과 출력 :");
	puts(ch);  //ch에 저장된 문자열을 출력. 개행문자를 붙여서 나오기 때문에 자동줄바꿈이 됨
	printf("--개행문자확인 문장--");
}

 

 

===

 

문자열,문자,숫자 입력

scanf_s()

사용자로부터 데이터를 입력받는 기본 함수이다.

printf처럼 형식을 지정하여 값을 입력받을 수 있다.

scanf_s("%d %f", &num, &flo); 이런 식으로.

 

[주의]

%d %f를 써넣는 형식을 지정하는 공간에는 형식지정자 외에 \n같은 개행문자나 문자열을 넣지 않아야 정상적으로 작동한다.

 

scanf는 입력된 정보를 분리하는데 공백문자(개행문자, 탭, 공백)를 이용한다. 이게 무슨 소리냐면

#include <stdio.h>



void qq();


void main()
{
	qq();
}

void qq()
{
	int num; //정수
	float fl; //실수
	double db; //실수(double)
	char ch[20];// 문자열
	char ch2; //문자 하나

	printf("입력 :\n");
	scanf_s("%d %f %lf %s %c", &num, &fl, &db, ch, sizeof(ch), &ch2, sizeof(ch2));


	printf("\n결과 출력 :");
	printf("%d %.1f %.1lf %s %c", num, fl, db, ch, ch2);
}

scanf_s의 문장이 실행되면 제일 먼저, %d를 입력할 수 있다.

2를 입력했다고 치면 이제 %f를 입력할 수 있는데,

구분을 하기 위해 스페이스, 탭, 엔터 셋 중 하나를 이용할 수 있다는 것이다.

 

 

주의할 것은 읽어올 데이터의 타입이 문자 배열이라면 변수 이름 앞에 &(주소 연산자)를 붙이지 않는데,

그 이유는 ch가 이미 주소이기 때문이다.

&ch는 주소의 주소라는 뜻이므로 말이 안 된다. (배열과 포인터에대해서 올릴텐데 그때 자세히 설명함)

 

읽어올 데이터의 타입이 문자,문자열을 제외한 기본 데이터 타입중 하나라면 변수 이름 앞에 &를 붙인다.

 

그리고 _s가 붙은 입력 함수를 사용할 때 문자 or 문자열을 초기화하려면,

위 코드처럼 꼭 sizeof(해당변수이름)을 입력해야 한다.

 

 

 

또 %s 지정자를 사용하여 문자열을 읽을 때 공백이 포함되어 있으면 공백 바로 전까지만을 하나의 문자열로

인식한다.

↑ 실험을 해보자

char ch[20];



printf("입력 :\n"); 
scanf_s("%s",ch, sizeof(ch)); 


printf("\n결과 출력 :"); 
printf("%s", ch);

이런 코드일 때 abcd(공백)efgh를 입력하려고 한다.

위와 같이 공백을 기준으로 efgh는 문자열로 인식하지 않고 abcd만을 문자열로 인식하는 것을 알 수있다.

 

(참고ㅅ)

luyin.tistory.com/180

 

[C언어] 표준 입력 함수( getchar() , getche(), getch(), gets(), scanf() )

* 문자 입력함수 1. getchar() => stdio.h 존재. => Enter : 입력종료 + Enter값도 \n 값으로 키보드 버퍼(KeyBoard Buffer)에 저장. => Space : 공백으로 입력처리. => 단점 : getchar()로 숫자를 입력받을때,..

luyin.tistory.com

 

 

cbw1030.tistory.com/95

 

C언어 getchar(), getch(), getche() 함수들의 차이점

세 함수 모두 입력을 받는 함수이다. getchar() 하지만, getchar()는 입력버퍼를 사용하고 getche()와 getch()는 입력버퍼를 사용하지 않는다. 즉, getchar()는 입력버퍼를 사용하기 때문에 엔터가 들어올 때

cbw1030.tistory.com

 

+ Recent posts