C言語の入出力関数の説明として、1文字系、1行系の説明を行う。
- getchar(),putchar(),fgetc(),fputchar()
- gets(),puts(),fgets(),fputs()
- stdin,stdout,stderr
- 入出力バッファと高水準入出力関数
- バッファオーバーフロー
fopen,fcloseの説明が夏休み前なので、復習の意味で説明。
/* fscanf,fprint説明 */ FILE* fp ; fp = fopen( "abc.txt" , "rt" ) ; if ( fp != NULL ) { int x ; while( fscanf( "%d" , &x ) == 1 ) printf( "%d" , x ) ; fclose( fp ) ; }
1文字入出力の説明。char型 'a' であることの明記と、 EOF(End Of File)の説明。EOFの入力方法の説明がまだ。
このプログラムの説明で、"This"と入力しても、"TThHiIsS"と 表示されない点を述べ、入出力のバッファリングが機能している点を明言。
/* getchar,putchar説明 */ int c ; while( (c = getchar()) != EOF ) { if ( 'a' <= c && c <= 'z' ) putchar( c - 'a' + 'A' ) ; else putchar( c ) ; }
入力用と出力用の2系統のファイルポインタを使う例で、fgetsの説明。
/* fgets説明 */ FILE* fp_in ; FILE* fp_out ; fp_in = fopen( "in.txt" , "rt" ) ; if ( fp_in != NULL ) { if ( (fp_out = fopen( "out.txt" , "wt" )) != NULL ) { char buff[ 100 ] ; while( fgets( buff , 100 , fp_in ) != NULL ) fputs( buff , fp_out ) ; fclose( fp_out ) ; } fclose( fp_in ) ; }
安全な入力
行入力の説明で、getsは使うな!と明言したので、 その理由として、バッファオーバーランを説明し、その安全対策を説明する。
/* 危険なコード */ char s[100] ; scanf( "%s" , s ) ; /* 安全な入力 */ char s[ 100 ] ; int x ; char buff[ 100 ] ; while( fgets( buff , 100 , stdin ) != NULL ) { if ( sscanf( buff , "%s %d" , s , &x ) == 2 ) { : } }
標準入出力
前のコード中の、stdin の説明として、 標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr) を説明する。