- ベストアンサー
ポインタと文字列(C言語)
サンプルソース char *myfgets(char *s, int n, FILE *in){-----(1) int ch; while((ch = fgetc(in)) != '\n'){ if(ch == EOF) return NULL; *s++ = ch; if(*s == (n - 1))------(2) return NULL; } *s++ = '\n'; *s = '\0'; return s; } 自分でfgets関数を作ろうという課題なのですがポインタがいまいちつかめません。 (1)のchar *myfgetsの部分の関数のポインタというのは要するにどういうことに使うのでしょうか? (2)の場合の*sは配列の要素数を表しているのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
回答1: ・戻り値が char 型のポインタだと読み取った文字列 s を呼び出し元でそのまま使えます。 つまり、puts( myfgets(buff,sizeof(buff),fp) ); という1行で読み込んだ文字列を そのまま表示できるため。ただし、エラーがない場合のみです。 ・もしくは文字列の取得ですので戻り値には文字列を返す。という考えかも。fgetc が文字を 返すのにあわせているのかな? ・あとエラーが起こると NULL を返す仕様ですので char 型のポインタにしている。 回答2: ・要素数は表してはいません。s ポインタの文字を参照して (n-1) で比較しています。 やりたいことは分かります。 要素数が (n-1) になったらば読み込み処理を中止したいのですよね。 でも、if(*s == (n - 1)) では正しくありません。バグです。 その他: ・配列 s に1文字ずつ文字を格納していったらば、n をデクリメントしていき残りが 1 個に なったら読み込みを終了するようにすれば良い。これを元に while 文を構成します。 ・あと文字を少し読み込んで EOF に到達した場合は、NULL をリターンしてはいけません。 少しでも読み込んでいれば EOF に到達しても文字列 s の先頭ポインタを返します。 このため、最初に feof() 関数で EOF の到達チェックを行います。 ・戻り値は文字列 s の先頭ポインタを返します。よって、s ポインタを進めてしまうと戻り値に 戻せなくなります。注意! サンプル: char *p = s; ←コピー int ch; if ( feof(in) ){ ←最初に EOF チェック return( NULL ); } if ( n > 0 ){ while ( --n >= 1 ){ ←『--n > 0』でも良い /* 読み込み処理の記述 */ } *p = '\0'; } return( s ); ←先頭ポインタを返すこと
その他の回答 (2)
- kb-nike
- ベストアンサー率36% (72/200)
<(1)のchar *myfgetsの部分の関数のポインタというのは要するにどういうことに使うのでしょうか? 関数 myfgets( ) の戻り値の型が char 型を指すポインタであることを示しています。 通常、関数が成功すれば文字型配列の先頭アドレスを返し、失敗すれば NULL を返すという風に使います。 <(2)の場合の*sは配列の要素数を表しているのでしょうか? *sは配列の先頭の要素に格納されている値(char型)を示しています。
- Werner
- ベストアンサー率53% (395/735)
> (1)のchar *myfgetsの部分の関数のポインタというのは要するにどういうことに使うのでしょうか? それは関数のポインタではなく、 関数の戻り値の型が char * 型であることを示しています。 fgetsと同じに作るなら、 読み取り成功時にはsを ファイル終端到達時やエラー時にはNULLを返すようにしてください。 (関数内でsが変化しているので、変化する前のsを返す必要があります。) > (2)の場合の*sは配列の要素数を表しているのでしょうか? 表していません。 *sには次で読み込んだ文字が格納されますが、 その時点ではまだ何も代入されていないのでそこで参照する意味はありません。