일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- C언어 # 핵심 정리
- C++ 언어 #핵심정리
- C언어 #핵심정리
- MySQL #핵심정리
- C++ 언어 # 핵심 정리
- HTML #핵심정리
- C언어 # 부록
- PHP #핵심정리
- C++ 언어 # 핵심정리
- Hacking #Baic
- shell_script
- C언어 #부록
- Bandit
- Today
- Total
cCcode
C Language [핵심정리] - 5 본문
1. 입력 값을 받아오기
scanf 함수를 통해 사용자의 입력을 받을 수 있습니다.
◎ scanf(서식, 변수의 주소); - 해당 함수가 성공하면 가져온 값의 개수를 반환하고 실패하면 EOF(-1)을 반환합니다.
scanf 함수는 나온 지 오래되었기 때문에 입력 값의 길이를 설정할 수 있는 기능이 없습니다. 따라서 일부 컴파일러에서는 scanf 함수를 사용하지 말라는 경고와 함께 컴파일 에러가 발생하는 데 현재 제가 사용하는 visual studio 라는 컴파일러 또한 안전상의 문제로 scanf 함수의 사용을 권하지 않습니다.
그래서 이럴 경우에는 어떻게 하냐..? 두 가지의 방법이 있습니다.
1) 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 함수를 사용해서 [표준입력 버퍼]에 있는 잔여문자들을 모두 무효화 시키는 방법이 있습니다. 다만, 첫 번째 방법은 입력 값을 따로 따로 받을 수 없고 형식 상 실수가 생길 수 있기 때문에 지금은 다루지 않겠습니다.
2) 경고 메세지를 출력하지 않게 하는 방법
이외에도 해당 파일 우클릭 → 속성 → SDL 검사를 '아니요'로 수정 후 저장하는 방법도 있습니다.
2. getchar 함수와 putchar 함수로 하나의 문자를 입력받고 출력하기
scanf 함수 대신 getchar 함수를 사용해서 문자를 입력받고 putchar 함수로 화면에 출력합니다. 두 함수 모두 <stdio.h>파일에 정의되어 있고 getchar 함수는 여러 개의 문자를 입력 받더라도 오직 처음 문자만을 반환합니다.
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 |