scanf 계열의 함수를 사용하다 보면 특정 문자열을 받고 싶은데 scanf 는 띄어쓰기나 탭, 엔터 모두를 분할해서 받기 때문에 이용하기가 힘든 경우가 있고 이 부분을 처리하다 보면 코드가 쓸데없이 길어지거나 하드코딩으로 가는 경우가 많다.
예를들어 fscanf 를 사용할때 아래와 같은 문자열을 받는다고 할때
김 원영(탭)남자(탭)010 1111 2222(엔터)
scanf("%[^\t]\t%s\t%[^\n]\n", name, sex, phone);
이렇게 받아주면 된다.
%[^\t] 는 탭 문자가 나오기 전까지 문자열로 받는다는 뜻이고 즉 띄어쓰기든 상관없이 탭까지 끊어 받는다는 뜻이다
만약 fscanf 의 경우 아래와 같은 데이터 파일에서 받는다고 가정했을 시
김 원영(탭)남자(탭)010 1111 2222(엔터)
김 김기(탭)여자(탭)010 1111 3333(엔터)
김 뭐시기(탭)남자(탭)010 1111 4444(엔터)
while( EOF != fscanf("%[^\t]\t%s\t%[^\n]\n", name, sex, phone) )
{
~~~~~~~~~~~~~~~~~~
}
이렇게 받아주면 된다.
EOF != ~~~~
는 fscanf가 파일의 끝을 만나면 EOF라는 상수값을 리턴해 주는데 EOF 라는게 나올 때 까지 while 문을 돌리게 된다.
그리고 마지막에 \n 이 들어가는 이유는 꽤 중요한데 만약 \n을 안써주게 되면 버퍼에 계속 \n이 남아있게 되어서 다음 받을때 영향을 주기 때문이다.
물론 \t 도 마찬가지