scanf() 함수 사용법 [타베산] 4.10

4.10 scanf() 함수 사용법

지금까지 printf 함수를 중심으로 설명했는데, 이번에는 콘솔 창에서 사용자의 입력을 이끌어내는 scanf의 사용법에 대해 자세히 알아보도록 하겠다.형식 지정자 format specifier 는 printf 와 비슷한 면이 많다.비교적쉽게이해할수있기때문에여러가지차이와주의사항이있으므로차이와주의사항을중심으로예시문제를살펴보자.

printf와 유사한 변환 지정자를 가지고 있다.

변환 지정자 conversion speci fiers 앞에 붙이는 수식어 modifiers도 있다.이 printf와 의미가 전혀 다르다.넓이를 의미하는 숫자도 입력할 수 있는데, 이는 printf 와 비슷하며, 아래의 것은 printf 와 거의 비슷하다.정수를 hort short에서 signed char와 unsigned char 두개를 받을 수 있으며, ll은 long long이므로 long long과 unsigned long long을 받을 수 있다.다음으로 h, l(소문자 l), L(대문자 L)을 각각의 경우에 대해서 정리했으니 필요할 때 표를 찾듯이 찾아보면 된다.j는 printf 에서 제시된 바와 같이 intmax_t 또는 unintmax_t 타입에 대해 사용할 수 있다.z도 size of를 설명하면서 여러 번 설명했고, 2포인트 차이를 사용할 때 t를 사용한다.

Windows에서 scanf를 warning 없이 사용하려면 이것을 앞에 붙이거나 프로젝트 세팅으로 바꿔야 한다.

intypes.h헤더는 intmax _t를 사용하기 위해 include했다.일반적인 경우 intypes.h 를 include 하지 않고 사용할 수 있다.

첫 번째 예제 보자.p rintf는 double과 float을 동일하게 %f를 이용하여 출력하였는데, scanf를 이용하여 double을 입력 받을 때는 lf를 반드시 사용하여야 한다.

실행해 보자.여러 개를 입력할 때는 첫 칸을 비운다.입력 후 enter를 누르면 입력이 들어온다.

이때 내부적으로 일어나는 과정을 조금 더 설명한다.hi를 추가하여 입력한 후 enter를 치면 입력을 받아들이면 scanf가 구동되는데, 여기서 콘솔창에서 깜박이며 기다리는 것도 scanf가 하는 것이고, enter를 쳤을 때 입력된 것을 해석하는 것도 scanf 내부에서 일어나는 일이다.한 글자씩 읽고 빈 칸에 있으면 입력하는 사람이 구분하는구나 싶어서 지금까지 입력받은 것을 첫 번째 %d 즉, 정수로 바꾼다.한 글자 한 글자 더 읽고 또 빈 칸에 있으면 이 사람이 입력을 끝내는구나 싶어서 두 번째, 즉 %f부동소수점에 저장한다.또, 도중에 빈 칸을 만나면, 읽기 버퍼라고 하는 입력을 받는 데이터가 임시로 저장되는 공간이 있지만, hi는 거기에 그대로 남겨 둔 상태로, 프로그램이 종료하면 사라진다.문장을 입력하는 방법은 나중에 다시 한 번 설명> 일단 scanf에서 string을 입력받을 때는 빈 칸이 있으면 끊어서 한 단어씩 받아볼 수 있다. 정도로 알 수 있으면 되고 <문장 입력을 받아서 한 글자씩 읽고 분석하고 이런 것은 나중에 다시 나온다. 읽는과정에대해설명해주고빈칸이있으면잘라서읽어준다.

앞에서 설명했지만 문자열, 특히 배열을 입력받을 때는 를 붙이지 말자.

이번에는 문자입력을 받아봐야겠다.코드를 보면 정수를 출력하고 있어. 즉 아스키코드를 출력하려는 것이다.

문자를 입력받는 것은 특징이 빈칸도 문자로 입력된다는 것이다.

빈칸을 입력하고 enter를 누르면 32가 나오는데 이는 빈칸 하나의 아스키 코드이다.

앞서 여러 개의 입력을 받을 때는 구분할 기호로 공란을 사용했는데, 문자를 입력할 때는 공란도 입력되기 때문에 표시했다.

이 예제를 하나 더 보여줄게. 이번에는 “unsigned”를 입력받는데, “unsigned i”를 선언했는데, 입력받을 때는 “signed”라고 입력하고 출력할 때도 signed로 출력한다.

123을 입력하면 당연히 123이 잘 출력이 되고

-123을 입력해도 -123이 빠르게 출력된다.unsigned인데 받을 때 signed로 받은 것을 그대로 unsigned 메모리에 저장했다가 다시 signed로 빼내기 때문에 자주 나오는 것이다.하지만 개인적으로는 이런 성질을 이용해 코딩하는 것은 좋지 않다.unsigned지만 음수를 다룰 수 있는 것이 아니라 내부적으로 음수인 것처럼 다루다 보니 오류가 우연히 정상적으로 작동하는 것처럼 보이는 것이다.이처럼 사소한 속임수로 자신과 남을 혼란스럽게 하는 것은 좋지 않다.

따라서 unsigned의 경우 이렇게 깔끔하게 unsigned로 대접하는 것이 좋다.

실행시켜 -1024를 실행시키면 쓰레기 값이 출력된다.이번에는 원래 %u는 unsigned이기 때문에 음수를 받을 수 없다.그 때문에 overflow가 발생해 숫자가 깨지는 것이 정상이다.

그다음에 floating pointnum bers를 볼까요?floating point numbers를 받는 옵션이 많기 때문에 전부 하지 않고 f만 한다.double은 scanf%lf에서 받아야 한다고 했다.그리고 출력은 %f로 했다.

실행해보면 double에 들어가고 double로 올바르게 출력된다.

printf에서는 l을 빼도 이상이 없었다.scanf에서 l을 빼면 어떻게 되는지 실행해 보자.

모두 0으로 출력된다.doubl ed를 0으로 초기화했는데 %f부터 size가 맞지 않아 문제가 생기는 것이다.

반대로 double을 float로 바꾼다면

문제없이 출력된다.

이것이 printf와 혼동해서 실수할 수 있는 부분이기 때문에 %lf를 사용할지 %f를 사용할지에 주의해서 사용하자.

입력 시 Scientific no tation 사용 가능하다.출력할 때 Scientific notation에서 출력하는 방법은 앞서 기술하였다.

width를 설정할 수 있다.여기서 는 string을 사용하는데 integer도 마찬가지로 작용한다.

5글자까지 입력되는 것을 확인할 수 있다.이것도 모든 자료형에 사용 가능하기 때문에 필요할지도 모른다.

hmodifier – 이건 수식어다. 수정자라고도 부른다.char 타입에 대해 사용할 때는 h를 두 개 붙이고 short 타입에 대해서는 h를 하나 붙인다.printf에서 본 적이 있어

127은 자주 들어가지만

signed char이므로 256을 넣으면 문제가 생긴다.형식 지정자와 입력받는 크기를 잘 맞춰야 한다는 점을 다시 한번 강조한다.

같은 Integer지만 이번에는 글자를 섞어서 넣어보자

문자를 만나면 더 이상 가면 안 된다며 해석을 중단하고 문자를 만나기 전까지 숫자만 가지고 i에 넣는 방식이다.

jmodifier는 전술한 바와 같이 int max_t(최대 정수형 타입)을 받는 의미에서 j를 붙인다.

portable 타입이라는 것과 차이가 있고 그 외에는 다른 자료형과 비슷하게 사용할 수 있다.

Regular characters는 나중에 문자열을 입력할 때 규칙에 맞게 입력되는 정규식이 있다.본 강의의 범위는 좀 벗어나 있는 것 같고 그런 것이 있다는 것만 용어를 기억하기 바란다.Regular characters가 그대로 나온 것이 아니라 나중에 확장될 수 있다는 것을 알아두자.

이번에는 scanf에서 입력을 받을 때 %d뒤에 (쉼표), 즉 문자를 넣었다.문자를 입력하면 해당 문자를 함께 입력해야 두 개의 구분을 할 수 있다고 scanf가 인식한다.

쉼표를 기준으로 123은 a로, 456은 b로 들어간다.

쉼표를 찍어야 구분이 되며 이상한 값이 출력된다.

이렇게빈칸을채우면문제가생긴다.

이때 앞에 빈 칸을 하나 더 넣으면 입력받을 때 빈 칸을 무시하라는 뜻이 된다.

이렇게 정상적으로 입력할 수 있다.

빈칸 2개를 넣어보면

이때도 빈칸 2개를 무시했기 때문에 정상적으로 작동한다.

쉼표 이외에도 다른 기호 또는 알파벳도 사용할 수 있다.58~64열 : 각자 한 번씩 해보자

비슷한 용도로 빈칸 blank 를 character로 입력 받을 수 있다.

빈칸이 char로 입력되는 것을 알 수 있다.

다른 글자를 넣어도 똑같이 넣는다.글자를 읽다가 글자가 만나면 %c에 넣고 글자가 끝나면 다시 %d에 넣는다.

뒤로 가면 입출력을 받는 다른 함수들도 공부한다.한 글자씩 입력을 받을 수 있고 파일에서 입력을 받을 수도 있으며 파일로 출력할 수도 있다.printf 나 scanf를 먼저 배우는 이유는 여러분이 c언어의 특징, 프로그래밍을 할 때 하나하나 신경써야 한다는 주의사항을 공부하기 쉽습니다.뒤로 갈수록 재밌는 게 많이 나와!

전술한 printf에 return 값이 있듯이 scanf에도 return 값이 있다.scanf의 return 값은 item을 몇 개나 입력받았는가이다.

2개 입력을 받았으므로 2를 return하여 i에 들어간다.

*(별) modifier는 printf와 s canf 용법이 크게 다르다.84 행 : printf에서는 width가 *에 들어가고 i는 d자리에 들어간다.

83행 : 예제가 조금 다르게 width를 scanf로 입력 받았으며 84행 : 그에 맞게 출력한다.

width가 실제 출력되는 넓이보다 적고, 모두 출력해야 하기 때문에 모두 나온 것이다.

이번에는 5를 입력하면 width가 남으므로 앞의 빈칸으로 채워진다.

starmodifier는 width를 조절할 수 있음을 알려주었다.scanf와 섞어 쓰면 더 유연하게 사용할 수 있다는 것이다.실제로 프로그래밍할 때 출력 옵션을 script file, GUI, scanf 등 유연하게 바꿀 수 있다.즉 출력할 때 width를 고정시키는 것이 아니라 실행할 때마다 바꿀 수 있다.

scanf에서 starmodifier를 어떻게 사용하는지 보여드리는데 용법이 완전히 다르다.우선 printf와 함께 있을 때를 다시 한 번 사용해 보자.88줄 : %*d가 있고 *가 없는 d가 하나 더 있다.이럴 때는 %*d를 무시한다.

입력은 3가지 정수 모두 받지만, 받는 것은 *가 없는 마지막에만 받는 것이다.입력을 받을 때 빈칸을 넣지 않고 행을 바꾸다가 scnaf에서 입력한 것을 읽고 구분할 기호로 빈칸 또는 줄바꿈을 찾는다.앞에서 배운 것처럼 특수문자, 알파벳 등과 조합해서 사용할 수도 있다.

빈칸으로 둘 수도 있다는 것이다.

*가 없으면 입력을 받는 것은 복수 받지만, 입력을 무시하고 변수에 대입시키지 않는다.

지금까지 scanf의 사용법에 대해 여러 가지 설명했습니다.

출처 http://www.inflearn.com/course/following-c/dashboard

error: Content is protected !!