Formatted Input/Output adopted from KNK C Programming : A Modern Approach
The printf Function (1/3) printf 함수는출력될문자열과해당문자열에포함되어야할값들로구성되어있음 printf(format_string, expr1, expr2, ); 출력될문자열은일반글자들과 % 로시작되는형식지정자가포함될수있음 형식지정자는출력될값이표현될위치를나타냄 %d 는 int 형값에쓰임 %f 는 float 형값에쓰임 2
The printf Function (2/3) 일반문자는기록된데로표현되고형식지정자는뒤따라오는변수 / 값을표혀함 Example: int i, j; float x, y; i = 10; j = 20; x = 43.2892f; y = 5527.0f; printf("i = %d, j = %d, x = %f, y = %f\n", i, j, x, y); Result: i = 10, j = 20, x = 43.289200, y = 5527.000000 3
The printf Function (3/3) 컴파일러는몇개의형식지정자가사용되었는지검사하지않아도됨. 하지만, 형식지정자의개수와변수 / 값의수는같아야함 printf("%d %d\n", i); /*** WRONG ***/ printf("%d\n", i, j); /*** WRONG ***/ 컴파일러는형식지정자가제대로쓰였는지검사하지않아도됨 형식이맞지않으면의미없는결과를출력하게됨 : int i; float x; printf("%f %d\n", i, x); /*** WRONG ***/ 4
Conversion Specifications 형식지정자 (1/2) minimum field width 필드의길이 optional conversion specifier 형식지정자 %m.px %5.3f %8d %-8d Precision 정밀도 optional 12345.6789 12345.678 12345 12345 %d Integer 정수 %e - Exponential format 지수 %f - Fixed decimal 소수점 %g - Either exponential format or fixed decimal format 지수형이나소수점형 5
Conversion Specifications (1/2) Format specifier Description Supported data types %c Character char unsigned char %d Signed Integer short unsigned short int long %e or %E Scientific notation float of float values double %f Floating point float %g or %G Similar as %e or float %E double %hi Signed Integer(Short) short %hu Unsigned Integer(Short) unsigned short %i Signed Integer short unsigned short int long %l or %ld or %li Signed Integer long %lf Floating point double %Lf Floating point long double %lu Unsigned integer unsigned int unsigned long Format specifier Description Supported data types %lli, %lld Signed Integer long long %llu Unsigned Integer unsigned long long short %o unsigned Octal short representation of int Integer. unsigned int long %p Address of pointer void * to void void * %s String char * %u Unsigned Integer unsigned int unsigned long short %x or %X unsigned Hexadecimal short representation of int Unsigned Integer unsigned int long %n Prints nothing %% Prints % character 6
Escape Sequences 특수문자 (1/2) \n 와같은서식을 escape sequence 특수문자라함. 특수문자는제어용출력이안되는문자와특별한의미를갖는 와같은문자들로구성되어있음 특수문자의일부 : Alert (bell, 종소리 ) \a Backspace 백스페이스 \b New line 줄바꿈 \n Horizontal tab 탭문자 \t 7
Escape Sequences (2/2) 문자열에는특수문자가몇이든포함될수있음 : printf("item\tunit\tpurchase\n\tprice\tdate\n"); Item Unit Purchase Price Date 주로사용되는특수문자는 \" 로서 " 문자를출력함 : printf("\"hello!\""); /* prints "Hello!" */ \ 문자를쓰려면, \ 문자를두번연속으로쓰면됨 : printf("\\"); /* prints one \ character */ 8
The scanf Function scanf 는특정형식으로입력을읽음 scanf(format_string, &var1, &var2, ); scanf 의문자형식은일반문자와형식지정자 scanf 의형식변환은 printf와동일함. 많은경우 scanf 의문자형식은형식지정자만포함하고있음 : int i, j; float x, y; scanf("%d%d%f%f", &i, &j, &x, &y); 예제입력 : 1-20.3-4.0e3 scanf 는 1, 20, 0.3, 4000.0 을 i, j, x, y 에저장함 9
How scanf Works (1/4) scanf 는입력된글자들을형식지정자에매치를시키는일을함 각형식지정자에대해 scanf 는공백문자는제외하고입력값을해당형으로변환함 scanf 가입력된값을읽어들인후형식에맞지않는글자가나오면멈춤 정보를제대로읽었으면 scanf 는다음문자형식을처리함 더읽을것이없으면 scanf 는즉시리턴함 10
How scanf Works (2/4) 숫자를찾는동안공백문자는무시함 스페이스, 탭, 줄바꿈등 scanf 호출로 4 개의수를읽는예 scanf("%d%d%f%f", &i, &j, &x, &y); 이경우입력이여러줄에걸쳐입력될수있음 1-20.3-4.0e3 1-20.3-4.0e3 ssrsrrrsssrrssssrrrrrr (s = 건너뜀 ; r = 읽기 ) scanf 는마지막줄바꿈기호를읽지는않고 엿보기 만한다 11
How scanf Works (3/4) 정수를읽으려고하면 scanf 는먼저숫자와더하기또는빼기기호를찾음. 그리고숫자가아닌것이나올때까지읽음 소수점을읽으려고하면다음의순서대로정보를찾음 덧셈, 뺄셈기호 (optional), 그리고 숫자 ( 소수점을포함하는 ), 그리고 지수 (optional). 지수는문자 e ( 또는 E) 를쓰고, 양수음수부호와하나또는그이상의자리수로구성. scanf 에서 %e, %f, %g 는서로교환이됨. 만약 scanf 가이번읽기시도에서포함이불가능한문자를만나게되면그문자의읽기를취소함 12
How scanf Works (4/4) 예제입력 : 1-20.3-4.0e3 scanf 의호출은앞의예에서와같음 : scanf("%d%d%f%f", &i, &j, &x, &y); 새로운입력을 scanf 가어떻게처리하는지보자 : %d : 1 을 i 에저장하고 문자는되돌려놓음 %d : 20 을 j 에저장하고. 문자는되돌려놓음 %f : 0.3 을 x 에저장하고 - 문자는되돌려놓음 %f : 4.0 103 을 y 에저장하고줄바꿈문자는되돌려놓음 13
형식문자열의일반문자 하나또는그이상의공백문자를형식문자열에서만나면 scanf 는공백문자가아닌문자를만날때까지공백문자를계속읽음 공백문자가아닌문자를만나면 scanf 입력받아야하는형과같은지비교함 같으면, scanf 다음번처리할형식으로이동함 다르면, scanf 다른문자를복원하고종료함 Examples: 형식문자열이 "%d/%d" 이고입력이 5/ 96 이면, scanf 성공. 입력이 5 / 96 이면, scanf 실패, / 문자가형식문자열에지정한값과다르기때문 공백을허용하려면 "%d /%d" 이렇게써야함. 14
printf 와 scanf 주의점 (1/2) scanf 과 printf 의호출이유사해보이지만, 매우다른함수임 흔한실수 : & 를 printf의인자에쓰는경우 printf("%d %d\n", &i, &j); /*** WRONG ***/ scanf 의형식문자열이 printf 의형식문자열과같아야한다고착각하면안됨 scanf의호출예를보자 : scanf("%d, %d", &i, &j); scanf 는먼저입력으로정수를기대하며, 그값을 i 에저장. scanf 은그리고쉼표가입력되기를기대함 입력이쉼표가아니라공백이면 scanf 는 j 를위한값을읽지않고종료함. 15
printf 와 scanf 주의점 (2/2) scanf 의형식문자열의끝에줄바꿈기호를넣는것은좋은생각이아님 Scanf 는줄바꿈기호를공백과같이처리하기때문에다음칸으로이동과같은의미로사용됨 "%d\n" 이라고쓰면, scanf 는공백문자를무시하고정수를읽은뒤다시공백문자가아닌글자가들어오기를기다리게됨 이런경우프로그램이멈춘것처럼보이게됨 16