volatile 형한정어

언어/C 2016. 10. 19. 10:36

변수와 관련된 모든 연산에 대해 컴파일러가 '최적화' 규칙을 적용하지 않는다. <-> const와는 반대의 역할


CPU는 빠른 연산을 위해 캐시 메모리를 사용하는데, volatile로 선언된 변수는 캐시로 처리되지 못한다. 효율은 떨어질 수 있으나 주기억장치에 정보가 읽고 쓰이는 행위는 보장 받을 수 있다. 

Posted by 知彼知己百戰不殆
,

scanf와 fgets 함수를 같이 사용하면서 나타나는 문제점


fgets 함수를 먼저 쓰든 scanf를 먼저 쓰든 두 함수가 연속적으로 온다면 둘중에 한 개의 함수만 실행되고 나머지 함수는 무시된다. fgets 함수나 scanf함수는 입력 버퍼에 Enter키가 입력될 때까지 입력을 받고, 출력은 \n(개행문자) 전까지의 데이터를 출력해준다. 따라서 입력 버퍼에는 아직 \n(개행문자)가 남아있으므로 두 번째 함수가 실행될 때는 자동으로 개행문자 데이터가 남아있으므로 함수가 입력이 끝난 줄 알고 종료한다.

따라서 이런 현상을 방지하려면!!!!!!!


윈도우: fflush(stdin)

리눅스, UNIX: fpurge(stdin)

을 사용해서 입력 버퍼에 있는 내용을 비워내야 한다. 그리고 fflush 함수는 입력 버퍼를 비우는 함수가 아니라 출력 버퍼를 비우는 함수이다. 하지만 MS 윈도우가 C 표준을 지키지 않은 덕분에 이렇게 사용도 가능하다.


호환성을 생각하는 코드를 작성해야 한다면, scanf("%d %*c", ~~~)로 작성을 해야 한다.

%*c는 문자 하나를 입력 버퍼에서 읽어온 후 그냥 버린다는 의미이다.

Posted by 知彼知己百戰不殆
,

참고 사이트들

OS/Linux 2016. 10. 13. 17:23

C 라이브러리 함수

http://forum.falinux.com

Posted by 知彼知己百戰不殆
,