C언어/ scanf가 나를 개무시하잖아

리얼니트·2021년 9월 5일
0

1학년

목록 보기
4/24
post-thumbnail

scanf("%d\n", &a);

이런식으로 쓰다보니까 빌드하고 터미널에서 값을 입력하면 그냥 무시되는 경우가 있음. 그리고 다시 문자나 문자열 입력을 요구함.
보통 이런 경우는 전체적인 코드는 맞게 짰는데도 결과값이 이상하게 나오게 되더라.

scanf() 함수는 데이터를 입력 받을 때 버퍼를 이용하는데, 버퍼에 가져올 값이 없으면 사용자에게 데이터를 입력 받기 위해 모니터 화면에 커서를 깜빡 거리게 한다. 그리고 키보드로 데이터를 입력한 후 Enter를 치면, 그때 입력한 데이터와 Enter가 한꺼번에 키보드 버퍼에 들어가게 된다.
따라서 버퍼 내에서 찌꺼기 값으로 존재하는 Enter의 데이터를 없애야만 한다.

그리고 %d에서보다는 문자를 받는 %c를 사용하는 경우에 문제가 많이 발생함.

해결법 1)
일단 scanf안에 \n이 있다면 지워서 빌드 해본다.

그래도 에러가 발생할 경우.

해결법 2)
fflush(stdin);
키보드 버퍼를 지우는 기능이다. 하지만 gcc에서는 안된다고 한다.

해결법 3)
scanf안에 공백을 넣는다.
scanf(" %d", &a); 이런식으로 사용.

(참고 링크 : https://codingfun.tistory.com/124)


(21.09.10 추가)
배열에다가 scanf를 쓸 때 여러가지 문제가 많이 발생했다.
특히 배열의 각 자리에 값을 입력받는게 아닌, 문자열을 입력받아야 할 상황일 때 더 그랬다.
char arr[10];
scanf("%s",&arr);
우선 배열에서는 &를 쓰지 않는다.

&는(앰퍼샌드) 해당 변수의 주소를 가리키는 역할을 한다.
값을 입력하기 위해 변수의 주소가 필요하기 때문에 &를 쓰는 것이다.
그러나 문자열(%s)의 경우 문자열 자체(변수가 포인터거나 배열 일때)가 주소이므로 &가 필요가 없는 것이다.

따라서 변수가 포인터, 배열일 경우에는 &를 쓰지 않는다.
char arr[10];
scanf("%s",&arr);

코드를 짜다가 배열 두개에 연달아서 입력값을 받아야하는 상황이 생겼다.

char arr1[3], arr2[3];
scanf("%s",arr1);
scanf("%s",arr2);
printf("%s",arr2);

이렇게 하면 arr2에 값을 입력받은 후에 arr2를 출력하는 줄 부터는 작동을 안하고 바로 종료가 되어버린다.
해결방법은 두가지가 있었다.

char arr1[3], arr2[3];
scanf("%s",arr1);
printf("%s",arr1);
scanf("%s",arr2);
printf("%s",arr2);
char arr1[3], arr2[3];
scanf("%s[^\n]",arr1);
scanf("%s[^\n]",arr2);
printf("%s",arr2);
profile
방구석에서 잘 살아요

0개의 댓글