ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C 언어] fgets()와 scanf() 함수의 차이
    프로그래밍/C언어 문법 2024. 4. 5. 03:04
    💡fgets()를 사용하면 scanf()로 생기는 에러를 방지할 수 있는 이유

     

    fgets()

    char *fgets (char *문자열을 저장할 char주소, int 문자열 길이, FILE *파일스트림);

    • fgets() 함수는 파일 스트림에서 문자열을 읽어들이는 함수로, 특정 길이만큼 입력을 받아들인다.
    • fgets() 함수는 지정된 길이만큼 입력을 받으며, 만약에 입력이 없다면 사용자가 엔터를 누를 때까지 대기. 이러한 특성으로 인해 사용자가 메시지를 입력하는 동안에도 다른 작업을 수행할 수 있다. 

     

    scanf()

    int scanf(const char * 입력받을 문자열의 형식지정자, 문자열을 저장할 char주소, ... );

    • scanf() 함수는 형식 지정자를 사용하여 표준 입력에서 데이터를 읽어들이는 함수이다.
    •  scanf() 함수는 입력을 받을 때까지 대기(멈춤)하므로, 사용자가 메시지를 입력하는 동안에는 프로그램이 다른 작업을 수행할 수 없다. 즉, scanf()를 사용하면 입력을 받을 때까지 프로그램이 멈추어 있어서 채팅 메시지를 수신하고 출력하는 작업이 불가능해진다. 

     

    💡 [참고] fgets()와 scanf()에서 개행문자('\n') 처리 방법
    • fgets() 함수는 개행문자도 문자열에 포함한 뒤 그 뒤에 널 문자를 추가한다.
      • => strinf\n\0 형태로 저장.
      • 개행 문자를 만날 때까지 또는 지정된 길이만큼의 문자열을 읽을 때까지 입력을 받아들이며, 개행문자 또한 문자열에 포함시킨다.
    • scanf() 함수는 개행문자를 문자열로 인식하지 않고 널문자로 치환시킨다. 
      • 형식 지정자를 사용하여 입력을 받는다. 기본적으로 공백 문자(스페이스, 탭, 개행 등)을 기준으로 입력을 분리한다. 따라서 여러 형식 지정자를 스페이스, 탭, 개행 등으로 분리하여 한 번에 여러 변수에 대입 가능하다.
      • ex) scnaf("%s %s %s", char*, char*, char*);
      • 만약 %s 형식 지정자를 사용하여 문자열을 입력받는 경우, scanf()는 공백 문자를 만날 때까지 문자열을 읽어들인다. 따라서 \n 개행 문자를 만나기 전까지의 문자열을 입력으로 받아들이고 끝에 널 문자를 추가한다.
      • => strinf\0형태로 저장.
      • 따라서 scanf() 함수를 사용하여 문자열을 입력 받을 때, 개행 문자는 입력 버퍼에 남게되어 이후 입력에 영향을 줄 수 있다.

     

    • scanf() 이후 scanf()로 입력을 받는 경우는 문제가 크게 없지만,
    • scanf()이후 fgets()로 입력을 받는 경우, fgets()는 파일 스트림에 있는 문자열을 읽기 때문에 scanf()에 의해 버퍼에 남아있는 개행문자('\n')를 읽게되어 사용자 입력을 미처 받지 못하고 개행문자를 만나 종료된다. (자동으로 /n /0이 저장됨)

     

Designed by Tistory.
-->