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를 여러번 눌러도 계속 입력을 기다린다. 

댓글

이 블로그의 인기 게시물

C - 코드의 실행 단계

C - 코드의 가독성과 줄바꿈. 한 줄로만 코드를 작성해도 괜찮을까.