C 기초특강 표준입출력
printf() (1) 특징 임의의개수의인자출력 간단한변환명세나형식을사용한출력제어 형식 printf(control_string, other_argument) 예 printf("she sells %d %s for $%f", 99, "sea shells", 3.77); control_string: "she sells %d %s for $%f" other_arguments: 99, "sea shells", 3.77 변환명세는 % 로시작하여변환문자로끝남 2
printf() (2) printf() 변환문자 변환문자 c d,i u o x, X e E f g G s p n % 문자 10 진정수 대응되는인자의출력형태 부호없는 10 진정수부호없는 8 진정수부호없는 16 진정수부동소수점수 ; 예 : 7.123000e+00 부동소수점수 ; 예 : 7.123000E+00 부동소수점수 ; 예 : 7.123000 e 형식과 f 형식중짧은쪽 E 형식과 f 형식중짧은쪽문자열대응되는인자가 void 포인터임 ; 그값이 16 진수형태로출력됨대응되는인자는정수형포인터로서그값은현재까지출력된문자의개수임 ; 인자는변환되지않음 %% 의형식으로 % 를출력스트림에씀 ; 대응되는인자는없음. 3
예제 printf() (3) printf("she sells %d %s for $%f", 99, "sea shells", 3.77); 변환형식대응되는인자 %d %s %f 99 "sea shells" 3.77 4
printf() (4) % 와변환문자사이에올수있는것들 플래그문자들 빼기기호 좌측정렬 ( 생략하는경우기본은우측정렬 ) 더하기기호 공백 # 기호 0 음이아닌수에 + 기호를붙임 signed 변환에서음이아닌수앞에공백을붙임 변환문자 o 와함께쓰면 8 진수앞에 0 을붙이고, x 나 X 변환에서는 16 진수앞에 0x 또는 0X 를붙임 G 나 g 변환에서는뒤에 0 을붙이고, e, E, f, g, G 변환에서는정밀도가 0 이라도소수점출력 공백대신 0 으로채우라는의미 5
printf() (5) % 와변환문자사이에올수있는것들 ( 계속 ) 필드폭 양의정수로남는경우공백또는 0이채워짐. 부족한경우는필요한만큼늘어남 정밀도 점과음이아닌정수로구성되며, 출력될최소자릿수를지정 s 변환에서는출력될문자의최대개수지정 h 또는 l h는 short, l은 long 변환자 l 다음에 n이오면 long int나 unsigned long int 형 L 실수형변환에서 long double로변환 6
printf() (6) 선언과초기화 char c = 'A', s[] = "Blue moon!"; 변환형식대응되는인자필드내에서출력형태비고 %c c "A" 필드폭 1 ( 디폴트 ) %2c c " A" 필드폭 2, 우측정렬 %-3c c "A " 필드폭 3, 좌측정렬 %s s "Blue moon!" 필드폭 10 ( 디폴트 ) %3s s "Blue moon!" 공간이더필요함 %.6s s "Blue m" 정밀도 6 %-11.8s s "Blue moo " 정밀도 8, 좌측정렬 7
printf() (7) 선언과초기화 int i = 123; double x = 0.123456789; 변환형식 대응되는인자 필드내에서출력형태 비고 %d i "123" 필드폭 3 ( 디폴트 ) %05d i "00123" 영으로채움 %7o i " 173" 우측정렬, 8 진수 %-9x i "7b " 좌측정렬, 16 진수 %-#9x i "0x7b " 좌측정렬, 16 진수 %10.5f x " 0.12346" 필드폭 10, 정밀도 5 %-12.5e x "1.23457-01 " 좌측정렬, e- 형식 8
형식 scanf() (1) scanf(control_string, other_argument) 예 char a, b, c, s[100]; int n; double x; scanf("%c%c%c%d%s%lf", &a,&b,&c,&n,s,&x); control_string: "%c%c%c%d%s%lf" other_arguments: &a, &b, &n, s, &x 9
scanf() (2) scanf( ) 변환문자 변환문자입력스트림에서대응되는문자대응인자의포인터형 c d, i u o x, X e, E, f, g, G s p n, %, [...] 공백을포함한모든문자 10 진정수 ( 부호는옵션 ) 10 진정수 ( 부호는옵션 ) 8 진수 ( 부호는옵션 ) 16 진수 ( 부호는옵션 ) 실수 ( 부호는옵션 ) 공백없는문자열 printf() 함수의 %p 에의해출력되는것으로 일반적으로부호없는 16 진정수임 다음표참조 char integer unsigned integer unsigned integer unsigned integer floating type char void * 10
scanf() (3) scanf( ) 변환문자 변환문자 n 설명 입력스트림의문자와짝을이루지않는다. 대응되는인자는 정수형포인터로서, 지금까지읽어들인문자의개수를저장한다. % 입력스트림에서하나의 % 와짝을이룬다. 대응되는인자는없다. [...] 각괄호 [ ] 안에있는문자들을스캔집합이라한다. 이것은무엇이짝을이루는가를결정한다. 대응되는인자는문자배열의기본주소에대한포인터이고, 이배열은끝에자동적으로추가되는널문자를포함하여대응되는모든문자들을포함할만큼큰크기를가져야한다. 11
scanf() (4) 제어문자열은다음과같은것을포함할수있음 여백 입력스트림에있을수있는공백과각각대응 % 이외의공백문자가아닌일반문자 입력스트림의문자와반드시대응 % 로시작해서변환문자로끝나는변환명세 h l L % 와변환문자사이에 *(wildcard 문자 ) 이올수가있고, 그뒤에는최대폭을지정하는정수가올수있음. 그뒤에변환문자를수정하는 h, l, L 등이올수있음 d, i, o, u, x, X 변환문자앞에올수있으며, short int 나 unsigned short int 로저장됨을나타냄 d, i, o, u, x, X 변환문자또는 e, E, f, g, G 변환문자앞에올수있음. 정수형의경우 long int 나 unsigned long int 로저장됨을, 부동소숫점형의경우 double 로저장됨을나타냄 e, E, f, g, G 변환문자앞에올수있으며, long double 로저장됨을나타냄 12
scanf() (5) 예제 int i; char c; char string[15]; scanf("%d, %*s %% %c %5s %s", &i, &c, string, &string[5]); 입력스트림 45, ignore_this % C read_in_this** 결과 i : 45 c : C string[0-5] : "read_" string[5-14] : "in_this**" scanf() 는 4 를리턴 13
fprintf()/fscanf() 각각 printf() 와 scanf() 함수의파일버전 함수원형 int fprintf(file *fp, const char *format,...); int fscanf(file *fp, const char *format,...); fprintf(stdout,...); 와 printf(...); 는같은의미 fscanf(stdin,...); 은 scanf(...); 와같은의미 14
sprintf()/sscanf() 각각 printf() 와 scanf() 함수의문자열버전 함수원형 int sprintf(char *s, const char *format,...); int sscanf(const char *s, const char *format,...); 15
fopen()/fclose() 파일열기와닫기의전형적인예제코드 #include <stdio.h> int main(void) { FILE *ifp, *ofp; ifp = fopen("my_file", "r"); /* open for reading */ ofp = fopen("outfile", "w"); /* open for writing */... } fclose(ifp); fclose(ofp); 16
fopen() fopen(filename, mode) 형태의함수호출은 filename 파일을 mode 에지정된모드로열고, 파일포인터를리턴함 모드 모드 "r" "w" "a" "rb" "wb" "ab" 의미읽기위해문서파일열기쓰기위해문서파일열기첨부하기위해문서파일열기읽기위해이진파일열기쓰기위해이진파일열기첨부하기위해이진파일열기 UNIX(LINUX) 의경우이진파일과텍스트파일구별이불필요 모드뒤의 + 는파일을읽기와쓰기로모두연다는것을의미함 17
파일의임의의위치접근 ftell(file_ptr) 파일위치지시자의현재값을리턴 fseek(file_ptr, offset, place); 이것은파일위치지시자를 place 부터 offset 바이트떨어진곳을나타내는값으로설정함 place 의값은 0, 1, 2 중하나 각각파일의처음, 현재위치, 파일의끝을나타냄 18
파일의임의의위치접근 파일을역으로출력하는프로그램 #include <stdio.h> #define MAXSTRING 100 int main(void) { char fname[maxstring]; int c; FILE *ifp; fprintf(stderr, "\ninput a filename: "); scanf("%s", fname); } ifp = fopen(fname, "rb"); /* binary mode for ms-dos */ fseek(ifp, 0, SEEK_END); /* move to end of the file */ fseek(ifp, -1, SEEK_CUR); /* back up one character */ while (ftell(ifp) > 0) { c = getc(ifp); /* move ahead one character */ putchar(c); fseek(ifp, -2, SEEK_CUR); /* back up two characters */ } return 0; 19
과제 앞서수행한성적처리프로그램의결과를표형식으로정렬하여화면에출력하시오. 앞서수행한성적처리프로그램의결과를표형식으로정렬하여파일에저장하시오. 20