Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]

scanf 로 입력받을시 blank 인식은 어떻게 할까

2010. 4. 5. 10:52programming/c

728x90

blank(스페이스 바) 인식 방법은 어떻게 할까?


/*

키보드로 문자열을 입력 받을 때

scanf( "%s", ... ); 을 사용하면

공백문자(띄어쓰기)가  입력되면 더 이상 입력되는 문자들은 문자열 버퍼에

저장되지 않습니다..

 

화일의 경우에도 fscanf를 사용하는 경우

fscanf(  inputfile, "%s", ... ); 는

공백이 있는 문장을 다 읽어내지 아니합니다.

 

scanf이나 fscanf은 키 입력이나 문자를 다음과 같은 기준에 의하여 저장하기 때문입니다..

1. %[width]에 읽을 문자열의 폭 width만큼의 문자를 읽어 저장합니다.  

    scanf( "%3s", &buffer );     /* 3개의 문자만을 읽어서 저장합니다.

        width에 아무 것도 없을 때( %s)는 다 읽어 저장합니다.. */

 

2. 지정된 type_char가 아닌 문자( 지정된 데이타형에 속하지 아니하는 문자)가

    입력되면 더 이상의 입력은 저장되지 않습니다..

    scanf( %d", &i );   /* 32459A( 정수형이 아닌 문자형 입력)는 32459 만 i에 저장됩니다. */

 

3. 공백문자가 입력되면  더 이상의 입력은 저장되지 않습니다.

 

위의 세번째 항에 의하여 띄어쓰기가 있는 문자열은 띄어쓰기(공백문자) 직전까지의

문자열만이 저장되기 때문입니다. 

 

이러한 문제를 해결하려면 대신 fgetsgets를 사용할 수 있습니다.

 

char *gets(char *s);
char *fgets(char *s, int n, FILE *stream);

 

1. gets는 키보드로 부터 입력을 받을 때 ENTER KEY( NEWLINE :'\n' )입력이 있을 때까지의

   모든 문자입력을  읽어내어 저장합니다. 엔터 키는 널문자로 대치되어 저장됩니다.

 

2.  fgets는 화일과 같은 입력스트림에서 키보드 입력의 엔터 키와 같은 효과를 가지는

     NEW LINE  '\n' 문자를 맞날 때까지  문자들을 읽어내어 저장합니다,.

    gets와 다른 것은 끝에 저장된 문자열에 '\n'까지를 포함시킵니다.

 

    getsfgets함수에서 3번째 인자를 stdin( 표준입력)으로하는 특별한 경우라고

    볼 수있습니다.  */

 

 #include <stdio.h>
 #include <conio.h>

 

 void main()
 {
   int i = 0;
   char buffer[255];

 

   /* gets 함수를 이용하여 띄어쓰기가 있는 문자열을 읽습니다. */

   printf( "띄어쓰기가  있는 문장을 입력해보십시오.\n" );
   gets( buffer );
   printf( "%s\n", buffer );
   while( buffer[i] )
    printf( "문자[코드]: %c[%d]\n", buffer[i], (int)buffer[i] ),i++;

 

   /* fgets 함수를 이용하여 띄어쓰기가 있는 문자열을 읽습니다. */
   printf( "\n" );
   i = 0;
   printf( "띄어쓰기가  있는 문장을 입력해보십시오.\n" );
  
fgets( buffer, 255, stdin );

 

   /* buffer에 newline 문자('\n')(ENTER KEY)가 끝에 포함되어 있습니다. */
   printf( "%s", buffer );
   while( buffer[i] )
    printf( "문자[코드]: %c[%d]\n", buffer[i], (int)buffer[i] ),i++;

   getch();
 }


================================================================
scanf("%d",&a); 가 수행되었을때.. 보통 정수를 입력한 이후 엔터키를 입력하게 된다.

문제는 정수 입력에 대해서는 scanf 에 의해 처리가 되는데.. 엔터키는 아직 입력 버퍼에

대기중이라는 것이다..

 

그 후 scanf("%c, &yn); 라는 다른 scanf() 가 있을 때, %c 라는 것은.. 사실 임의의 문자를 입력받고자 함인데.. 엔터도 문자라는 것!!.

따라서 입력버퍼에 대기해 있는 엔터 문자가 scanf 가 의해 처리되면서..

scanf 함수에서 잠시 멈춰 사용자가 문자를 입력하도록 기다려야 하는데 그냥 넘어가버리는 이상한 현상이 발생하게 되는것이다.

 

여기까지는 늘상 알고 있었고...

해결책으로는 fflush() 를 쓰는 거였는데..


 

scanf("  %c, &yn );

 

이라고 해보세요. %c 앞에 공백이 하나 들어가 있네요.

scanf 함수의 공백은 생각보다 심오한 의미를 가지고 있는데요.

space 문자, tab 문자, new line 문자 등 제어문자를 무시할 수 있는 역할을 합니다.

사실 위의 것을 넓은 의미는 공백이라고 볼수가 있답니다.

fflush(stdion) 방법은 Visual C++ 기반의 Windows 에서는 효과가 있지만.. gcc 기반의 환경, 가령 cygwin 이나 LInux/Unix 환경에서는 동작을 보장하지 못한답니다.

 편한것을 사용하시되.. scanf 에서의 공백의 의미 정도는 알아두시면 나중에 편할 것입니다. 

PS. 저는 습관적으로 scanf 할때 %d, %c, %s 등 안가리고 앞에 공백하나씩 넣어둔답니다.

728x90

'programming > c' 카테고리의 다른 글

[C] 논리, 비트 연산자  (0) 2010.04.19
상수에 대한 이해  (0) 2010.04.19
[C프로그래밍] true , false  (0) 2010.04.05
코딩할때 최적화  (0) 2010.04.05
...before 'PCH creation point' 메시지와 함께 컴파일 불가  (0) 2010.04.05