fgetsではみ出たら
C言語で長い一行を読み込むのであれば、通常は”それなりに”大きい配列に読み込んでから、strdup() などでデータに応じた大きさで保存する。しかし、それ以上に長い1行を扱いたいのならどうするか…
どうしても長い一行を扱いたいのなら、realloc() などで拡張しながらデータを読み込む。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char buff[ 10 ] ; char*str ; if ( fgets( buff , sizeof( buff ) , stdin ) != NULL ) { // '#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char buff[ 10 ] ; char*str ; if ( fgets( buff , sizeof( buff ) , stdin ) != NULL ) { // '\0'を覚える必要があるので最大sizeof(buff)-1文字まで読み込まれる int len = strlen( buff ) ; if ( (str = (char*)malloc( len + 1 )) != NULL ) { strcpy( str , buff ) ; // printf( "|%s|\n" , str ) ; // 通常はここまで書けばひとまず十分。 // fgetsは行末文字'\n'まで読み込むのが基本 // 最終文字が'\n'でなかったら、読み残しがある。 while( buff[ len ] != '\n' ) { char*rp ; // '読み残し'を読み込む if ( fgets( buff , sizeof( buff ) , stdin ) == NULL ) break ; len = strlen( buff ) ; // str を realloc() で領域を拡張する // realloc()は、拡張するときは新しくメモリを確保し、 // 格納されているデータをコピーし、元領域を解放してくれる if ( (rp = (char*)realloc( str , strlen( str ) + len + 1 )) == NULL ) break ; else str = rp ; // reallocでは、広げられた領域に元データがコピーされているので、 // 後ろに'読み残し'分を追加する。 strcpy( str + strlen( str ) , buff ) ; // printf( "%s\n" , str ) ; } // 読み込んだ一行を表示 printf( "|%s|\n" , str ) ; free( str ) ; } } }'を覚える必要があるので最大sizeof(buff)-1文字まで読み込まれる int len = strlen( buff ) ; if ( (str = (char*)malloc( len + 1 )) != NULL ) { strcpy( str , buff ) ; // printf( "|%s|\n" , str ) ; // 通常はここまで書けばひとまず十分。 // fgetsは行末文字'\n'まで読み込むのが基本 // 最終文字が'\n'でなかったら、読み残しがある。 while( buff[ len ] != '\n' ) { char*rp ; // '読み残し'を読み込む if ( fgets( buff , sizeof( buff ) , stdin ) == NULL ) break ; len = strlen( buff ) ; // str を realloc() で領域を拡張する // realloc()は、拡張するときは新しくメモリを確保し、 // 格納されているデータをコピーし、元領域を解放してくれる if ( (rp = (char*)realloc( str , strlen( str ) + len + 1 )) == NULL ) break ; else str = rp ; // reallocでは、広げられた領域に元データがコピーされているので、 // 後ろに'読み残し'分を追加する。 strcpy( str + strlen( str ) , buff ) ; // printf( "%s\n" , str ) ; } // 読み込んだ一行を表示 printf( "|%s|\n" , str ) ; free( str ) ; } } }
2022年度授業アンケート
2022年度の授業アンケートの結果。今年は、私が作ったアンケートシステムが、moodle サーバの移行トラブルと共に使えなくなってしまったので、Forms により集計が行われた。
情報ネットワーク基礎(3EI/後期/必修)
総合ポイント 83.8 でまあまあの評価。課題の評価が高くなっているが、課題を最終成績の中にはあまり組み込んでいないが、Forms により小テスト形式で実施したことが評価されたと思われる。
情報制御基礎(3年学際(EIのみの回答)/前期/選択)
総合ポイント83.0 でまあまあの評価。指導書の評価が80.4 と低い評価となっている。Web資料で講義資料を提示しているが、口頭での説明で資料との連携が弱かったのが原因かもしれない。
情報メディア工学(前期)(4EI前期/必修)
総合ポイント 85.4 で評価は高いと思われる。講義内容の評価が82.9と若干低いが、それ以外は、86.7ポイントなどで評価が高かった。
情報構造論(4EI通年/必修)
総合ポイント89.0で、他の科目とくらべ良い評価が得られている。プログラムなどを苦手とする学生からは、敬遠されがちな中、高く評価されていると思う。
データベース(5EI後期/選択)
総合ポイント 86.3 で高い評価が得られた。シラバスと課題について他よりも高い評価であった。前年までは、自分のサーバで運用していた SQL サーバの実験環境を使っていたが、今年度は Paiza.io を用いたことで、自宅でも課題に取り組みやすかったことが評価されたと思われる。