cCcode

C Language [핵심정리] - 5 본문

C Language Basic

C Language [핵심정리] - 5

cCcode 2021. 5. 9. 23:32

1. 입력 값을 받아오기

scanf 함수를 통해 사용자의 입력을 받을 수 있습니다.

◎ scanf(서식, 변수의 주소); - 해당 함수가 성공하면 가져온 값의 개수반환하고 실패하면 EOF(-1)반환합니다.

scanf 함수의 형식

scanf 함수는 나온 지 오래되었기 때문에 입력 값의 길이를 설정할 수 있는 기능이 없습니다. 따라서 일부 컴파일러에서는 scanf 함수를 사용하지 말라는 경고와 함께 컴파일 에러가 발생하는 데 현재 제가 사용하는 visual studio 라는 컴파일러 또한 안전상의 문제로 scanf 함수의 사용을 권하지 않습니다.

 

그래서 이럴 경우에는 어떻게 하냐..? 두 가지의 방법이 있습니다.

1) scanf_s 라는 컴파일러에서 제공하는 함수를 사용하는 방법

scanf_s 사용법
결과

이 경우 정수를 입력할 때는 scanf동일한 형식을 사용하시면 되지만, 이외의 값들을 받을 때는 해당 변수들의 크기명시해줘야합니다. 위 코드처럼 값을 직접적으로 입력해줄 수도 있지만, 대신 unsigned int(sizeof(char))을 사용할 수도 있습니다. 당연히 char변수명으로 수정해줘도 되고요.

 

제가 사실 sizeof 만 사용해도 된다고 알고 있었습니다만.. sizeof 만을 사용한 결과 [%c 서식지정자에는 'unsigned int' 형식인수가 필요하지만 sizeof 연산자size_t 형식인수반환]해서 경고가 뜨더라고요. 그래서 형변환 해준겁니다.

 

[중요] 여기서 문자와 정수의 입력받는 순서를 바꾸면 문제가 하나 생깁니다.

정수와 문자의 입력 순서를 바꾼 결과

위에 결과처럼 문자를 입력받는 부분을 건너뛰는 문제가 생기는 것처럼 보입니다만 실상은 좀 다르죠. 일단 문자의 출력부분%c 서식지정자가 아닌 %d 서식지정자로 나타내보겠습니다.

서식지정자 수정 후 결과

보시는 것처럼 입력을 받지 않는 게 아니라 10에 해당하는 문자 즉, \n(줄바꿈) 제어문자 다른 말로는 Enter입력 값으로 받은 것입니다. 이런 문제는 %c 서식지정자가 문자를 하나씩 처리하다 보니 발생한 문제 입니다.

 

이 문제를 해결하기 위해서는 1) 하나의 scanf_s 함수여러 개의 서식지정자들나열하는 방법 2) rewind 함수를 사용해서 [표준입력 버퍼]에 있는 잔여문자들을 모두 무효화 시키는 방법이 있습니다. 다만, 첫 번째 방법은 입력 값을 따로 따로 받을 수 없고 형식 상 실수가 생길 수 있기 때문에 지금은 다루지 않겠습니다.

rewind 함수 사용
결과

2) 경고 메세지출력하지 않게 하는 방법

(1) 경고 메세지 출력 X 
(2) 경고 메세지 출력 X

이외에도 해당 파일 우클릭 → 속성 → SDL 검사 '아니요'수정 후 저장하는 방법도 있습니다. 

 

2. getchar 함수와 putchar 함수로 하나의 문자를 입력받고 출력하기

scanf 함수 대신 getchar 함수를 사용해서 문자를 입력받고 putchar 함수화면출력합니다. 두 함수 모두 <stdio.h>파일에 정의되어 있고 getchar 함수는 여러 개의 문자를 입력 받더라도 오직 처음 문자만반환합니다.

getchar 함수와 putchar 함수의 특징
결과

 

3. 증가,감소 연산자 이용하기

C언어에서는 증감,감소 연산자를 제공합니다. 이 부분은 간단해서 빠르게 설명한 후 넘어가겠습니다. 증가 연산자 ++1만큼 증가시키고 감소 연산자 --1만큼 감소 시킵니다. 이 두개의 연산자를 [증감연산자]라고 부릅니다. 이 때 증감 연산자가 앞에 있냐? 아니면 뒤에 있냐? 에 따라서 전위(prefix)연산자 인지 후위(postfix)연산자인지를 구분합니다.

전위 연산자와 후위 연산자
전위 연산자와 후위 연산자의 차이점
결과

위의 결과에서 볼 수 있듯이 전위 연산자는 1을 더한 후 대입하는 반면 후위 연산자대입한 후 1을 더하는 것을 볼 수 있습니다. 그래서 num ++ 은 num += 1동일한 효과를 낼 수 있습니다. 이 사실을 가지고 위에 소스들을 해석하자면 다음과 같습니다.

 

- 해석 (9 ~ 10줄, 17 ~ 18줄) - 

num = num + 1

num2 = num

num3 = num   

 

num2 = num

num = num + 1

num3 = num 

'C Language Basic' 카테고리의 다른 글

C Language [핵심정리] - 7  (0) 2021.05.11
C Language [핵심정리] - 6  (0) 2021.05.10
C Language [핵심정리] - 4  (0) 2021.05.08
C Language [핵심정리] - 3  (0) 2021.05.07
C Language [핵심정리] - 2  (0) 2021.05.06
Comments