• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:このプログラムのアルゴリズムを教えていただけませんか?)

プログラムのアルゴリズムとIPアドレス抽出手順

このQ&Aのポイント
  • ファイルlog.txtの文章中からIPアドレスを抜き出し、ip.txtに書き込むプログラムのアルゴリズムと手順を教えてください。
  • 具体的に、どのようにIPアドレスを検出しているのでしょうか。
  • プログラムの要点や処理の流れなどについても教えていただけると嬉しいです。

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

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.1

あらまあ、わざとややこしく書いてるプログラムみたいですねえ。 じゃあもうちょっとわかりやすく書き直してみますか? char *getFromIP(const char *line, char *buff) {  char *src, *dst;       // 作業用ポインタ  src = strstr(line, "from"); // fromを見つける  src += 4;          // fromの文字の分進める  dst = buff;         // 作業用ポインタ while(1)  {   if(isspace(*src))   {    src++;    continue;        // スペースを読み飛ばす   }   else break;        // スペース以外なのでループを抜ける  }                 // ここでsrcはIPアドレスの先頭を指している                 // 当然dstはbuffの先頭を指している                 // ここから文字列をコピーする  while(1)  {   *dst = *src;        // 文字をコピーする   if(*dst == ':')      // コロンだったら   {    *dst = '\0';       // コロンを終端文字に書き換えて    break;          // ループを抜ける   }   if(*dst == '\0')      // コロンが見つからないまま文字列が終わった場合   {    break;          // 仕方がないのでループを抜ける   }   dst++;           // ポインタを進める   src++;           // ポインタを進める  }  return buff;         // 戻り値は渡されたbuffのポインタ } ということですね。 え、これじゃダメ? じゃ、コメントつけてみましょか? char* getFromIP(const char* line,char* buff){ const size_t length = strlen(line); // 文字列の長さを求めておく size_t top,back = length-1,i,k;   // 変数定義 for(back = length-1;line[back] != ':';--back);                    // 文字列の最後から':'(コロン)を探す。 for(i=0,top = back - 1;i<3;++i){   // 見つけたコロンの位置から3回ループ                    //(コロンの1文字手前の位置をtopにセットしておく) for(;line[top] != '.';--top);    // ピリオドを見つけるまで一文字ずつ戻っていく。 } for(;line[top-1] != ' ';--top);   // 3個目のピリオドの前の位置からさらにスペースを探して                    // 1文字ずつ戻っていく。                    //(ということは、さっきの                    // ピリオド探してたのは                    // どういう意味があるのだろう)                    // ともかく、この時点でやっと                    // IPアドレスの先頭位置をみつけた。                    // ここから文字列をコピー               for(i=top,k=0;i<back;buff[k++] = line[i++]);                    // さっき見つけたコロンの                    // 位置までbuffに文字をコピーする…                    // あれ?終端文字をセットしてないよ! return buff;                    // おわりかよ! } このソースのキモは、 forの構文の使い方です。 for(A;B;C);はA;while(B){C;]と同じですが、読みづらくなります。はっきり言って、わざとやってるとしか思えません。そうでなければforがよっぽど好きなんでしょうね。 すべての一行forをwhileを使って書き直して、適切にインデントをつけるだけで、ずっと見通しがよくなります。やってみてください。 あと、元のソースではbuff2[32]={'\0'}としてます。 これもわざとやってるんでしょうね。 char buff[32]; memset(buff, '\0', 32); と同じ効果が得られると思いますが、わかりにくいです。 でも、あらかじめ初期化しておかなくてもいいように、最後にちゃんと終端文字をつけてやるほうが安全ですね。

masarui
質問者

お礼

分かりやすい説明だけでなく新しいプログラムも教えていただき本当にありがとうございました。

関連するQ&A