CreamPuff's HACK LAB

[코딩 연습/C] 3일차 (011~020) 본문

이전 글

[코딩 연습/C] 3일차 (011~020)

CreamPuffx2 2019. 5. 7. 02:45

코딩 연습 출처 : https://cafe.naver.com/funcc

 

011. printf 출력 형식 : 보기 좋게 출력하기

\t 탭 키(보통 8칸)만큼 띄우고 출력 
%-xd x칸을 잡고 좌측(-) 정렬
%yd y칸을 잡고 우측(+) 정렬

012. 정수 두 개 입출력(1)

"(정수를 입력 받을 때에는) 엔터, 탭, 스페이스 등으로 두 값을 구분한다."


013. 정수 두 개 입출력(2)

* 보안상의 문제로 scanf함수보다 scanf_s함수를 사용하는것이 안전하다.


014. 실수 입출력

"정수, 실수를 입력 받을 때는 변수 앞에 &를 붙인다."


scanf를 사용하여 문자 입력
getchar를 이용하여 문자입력

015. 문자 입출력(1)

"문자 입력은 scanf(%c), getchar 두 가지 방식이 있다."

 scanf getchar
scanf("%c", &character); character = getchar();

정상적으로 문자 입력
첫 문자 입력 후 엔터
* scanf_s 함수를 사용할 경우 정상 출력되지 않는다.

016. 문자 입출력(2)

"scanf_s함수는 scanf함수와 다르게 문자와 문자열 입력시에 

저장공간에 저장가능한 문자의 갯수를 같이 입력해줘야 한다."

scanf_s("%c%c", &a, &b, sizeof(a), sizeof(b));

요렇게 코딩해야된다는 말인데..

Dev C++에서는..

요렇게 아무 것도 출력이 되지않는다..

(심지어 이후 입력한 puts도 출력되지 않는다. 오류 발생 이후에는 NULL문자 발생하는 것인가?)

컴파일러 종류에 따른 결과값의 차이인듯 하다.


혹시 몰라서 컴파일러 버전 찍어둠

TDM-GCC 4.9.2 64-bit Release

일단은 넘어가자.


017. 문자 여러 개 입출력(3)_문제 해결

: 키보드 버퍼지우기

1) "fflush(stdin) 입력"

x를 입력하고 엔터를 치면 엔터값이 어딘가에 저장된다.

이것을 비워야!

이후에 입력되는 y값을 제대로 가져올 수 있다.

위와 같이 fflush(stdin);을 주석 처리하여

키보드 버퍼를 지우지 않으면

x입력 후 엔터를 입력 시

두 번째 문자 입력 단계에서 한 칸에 무언가가 입력(엔터값으로 추정)된 후 

마지막 결과 출력 값이 바로 나온다.


2) "%*c 추가 입력"

fflush(stdin)을 이용하지 않고

위와 같이 %*c를 추가 입력하여도 된다.

(어떤 의미인지는 모르겠다.)


3) "while(getchar() != '\n'); 입력"

fflush(stdin)을 사용하지 않고 

다음 입력에서 \n(엔터값)이 아닌 다른 문자가 입력될 때까지 입력을 계속 받도록 하는 명령어를 추가하는 방법인듯

이렇게 하면 엔터값을 입력값으로 받지않을테니 말이다.

※ Visual Studio 2017 버전이라면 fflush(stdin) 사용이 안되므로

위 방법을 이용해야 한다.


018. 문자 여러 개 입출력(4)

"문자만 입력 시에는 getchar 함수를 추천한다."

전용함수가 가장 좋다!

scanf getchar
범용 문자 전용

정수, 실수, 문자, 문자열

모두 입력 가능

문자만 입력 가능

'프린터, 팩스, 복사기 다 되는 복합기보다는, 프린터만 확실히 잘하는 전용 기계가 좋음'

scanf의 경우 여러 기능을 사용하게 되니 프로그램 자체가 무거워진다(프로그램의 크기가 커진다).

※ 프로그래밍은 크기와 속도가 좌우한다.

프로그램의 크기가 커짐 → 속도가 느려짐 → 하드웨어 비용 증가
프로그램의 크기가 작아짐 → 속도가 빨라짐 → 하드웨어 비용 감소

019. 문자열 입출력(1) : scanf

* 문자열을 변수를 선언할 때는 변수의 크기를 지정해주어야 한다.

(이 때 선언되는 것을 변수가 아닌 배열명이라고 한다.)

* 문자열 입출력에 사용하는 서식문자는 %s 


"scanf는 공백을 만나면 입력이 종료된다."

따라서 공백을 포함할 때는 사용하면 안된다.


020. 문자열 입출력(2) : gets

* gets(배열명);


"gets 함수는 공백을 포함할 수 있다."

공백을 포함할 때는 gets 함수를 사용하자.


 

'이전 글' 카테고리의 다른 글

[코딩 연습/C] 5일차 (026~035)  (0) 2019.05.10
[코딩 연습/C] 4일차 (021~025)  (0) 2019.05.08
[코딩 연습/C] 2일차 (006~010)  (0) 2019.05.06
[코딩 연습/C] 1일차 (001~005)  (0) 2019.05.05
Main Memory (주 기억 장치) 개요  (0) 2019.04.24