• ベストアンサー

人の書いた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; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

cBuff に文字列を書き込んだ後で 終わりの部分に ¥n と NULL を書き込んでいる。 また、 cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) この部分が書き込む位置です。 この値は、 メモリー上の場所を表している数値です。

age_03
質問者

お礼

解決できました。どうもありがとうございました!

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

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" );

age_03
質問者

お礼

解決できました。どうもありがとうございました!

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

??? > ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ) これがわからないのかな? それぞれが一体何の演算をしているのかを把握したら判るんじゃない? それとも「strcpy」や「strlen」が判らないのかな?それならその文字列でweb検索でもしたらすぐ出てくるんじゃない? 答えを直接書かないのはそういうサイトの約束なのでヒントだけ。。。

age_03
質問者

お礼

解決できました。どうもありがとうございました!

age_03
質問者

補足

わからないのは strcpy ( ( cBuff + strlen( cBuff ) - ( iCutcnt + 1 ) ), "\n" ); fprintf( Fp[1], "%s", cBuff ); の2行ですね。 ファイルの中身をcBuffに格納したものにその長さを足してある数値を引く。 それに\nをコピーする。 そしてFp[1]にcBuffを書き込む。 結局のところがよくわからりません。

関連するQ&A