- ベストアンサー
人の書いたc言語のプログラムで読めないところがあります。
c言語のソースの最後のループのところなんですが、 strcpy ( ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ), "\n" ); というところでどういう処理をしているのかわかりません。 Fp[0]は読みだし専用でファイルを開いたファイルポインタで Fp[1]は書き込み専用でファイルを開いたファイルポインタです。 iCutcntはコマンドライン引数で指定した任意の数字を数値化したものです。 while( 1 ) { if( !fgets( cBuff, sizeof( cBuff ), Fp[0] ) ) break; if( strlen ( cBuff ) < iCutcnt ) { iReturnValue = 1; break; } strcpy ( ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ), "\n" ); fprintf( Fp[1], "%s", cBuff ); } for( iLoopCnt = 0; iLoopCnt < 2; iLoopCnt++) fclose( Fp[ iLoopcnt ] ); return iReturnValue; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
cBuff に文字列を書き込んだ後で 終わりの部分に ¥n と NULL を書き込んでいる。 また、 cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) この部分が書き込む位置です。 この値は、 メモリー上の場所を表している数値です。
その他の回答 (2)
- mtaka2
- ベストアンサー率73% (867/1179)
C言語では、文字列は「文字の配列」として表現しており、 文字配列のうち'\0'がくるまでを「文字列」として認識します。 それをふまえたうえで、strcpy がどういう結果を生み出すのか考えてみてください。 以下の3つのコードはどれも同じ意味です。 ・その1 cBuff[strlen( cBuff ) - ( iCutcnt + 1 )] = '\n'; cBuff[strlen( cBuff ) - ( iCutcnt + 1 ) + 1] = '\0'; ・その2 strcpy ( &cBuff[strlen( cBuff ) - ( iCutcnt + 1 )], "\n" ); ・その3 strcpy ( ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ), "\n" );
お礼
解決できました。どうもありがとうございました!
- SAYKA
- ベストアンサー率34% (944/2776)
??? > ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ) これがわからないのかな? それぞれが一体何の演算をしているのかを把握したら判るんじゃない? それとも「strcpy」や「strlen」が判らないのかな?それならその文字列でweb検索でもしたらすぐ出てくるんじゃない? 答えを直接書かないのはそういうサイトの約束なのでヒントだけ。。。
お礼
解決できました。どうもありがとうございました!
補足
わからないのは strcpy ( ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ), "\n" ); fprintf( Fp[1], "%s", cBuff ); の2行ですね。 ファイルの中身をcBuffに格納したものにその長さを足してある数値を引く。 それに\nをコピーする。 そしてFp[1]にcBuffを書き込む。 結局のところがよくわからりません。
お礼
解決できました。どうもありがとうございました!