C - printf와 scanf 사용 방식의 차이점 및 흔한 실수
1. printf에 &(ampersand / 주소 연산자)를 사용하는 실수
1 2 | int i = 10, j = 20; printf("%d %d\n", &i, &j); | cs |
- printf는 단순히 변수의 값(value)을 출력하는 함수
- 그런데 위 코드처럼 &를 변수 앞에 붙이면 변수의 주소(address)가 출력됨
- 따라서 printf에서 &를 사용하면 해당 변수의 주소값을 출력함
printf의 올바른 사용은 아래와 같다.
1 printf("%d %d\n", i, j);cs 반대로 scanf는 입력받은 갑슬 변수에 저장해야 하므로 변수의 주소가 반드시 필요하다.2. scanf의 포맷 문자열에 불필요한 문자를 넣는 실수
1 | scanf("%d, %d", &i, &j); | cs |
- %d, 에서 쉼표는 숫자(정수) 다음에 ,(쉼표)가 입력력되어야 한다는 의미
- 하지만 사용자가 10 20 이렇게 쉼표 없이 입력하면, scanf는 10을 첫 번째 %d로 읽고, 그 다음 명시한대로 쉼표를 찾으려고 하지만 공백(white-space)이므로 그대로 종료한다. 결과적으로 j에는 값이 들어가지 않고, 이전 값 그대로이거나 쓰레기 값이 남을 수 있다.
- scanf는 포맷 문자열에 명시된 문자 그대로 입력할 것을 기대한다.
3. scanf 포맷 문자열에 \n을 넣는 실수
1 | scanf("%d\n", &i); | cs |
- \n은 scanf 입장에서 공백 문자로 간주된다.
- scanf는 다음 숫자를 읽은 후에도 공백이 아닌 문자가 나올 때까지 계속 기다린다. 즉 사용자가 Enter를 여러번 눌러도 계속 입력을 기다린다.
댓글
댓글 쓰기