• ベストアンサー

文章中から特定の文字列を抜き出すプログラムについて C言語

log.txtの文章からIPを抜き出しip.txtに書き込むというものです。log.txtの文章は基本的にfrom IP:port の順です。しかし文章中にfromがないとip.txtで空欄になってしまいます。 例192.168.1.100  192.168.1.110 理想はfromがない行はなにも追加せず次に移りたいのですがどうすればいいでしょうか? 例192.168.1.120 192.168.1.130 192.168.1.140 void addLine(const char*,FILE*); char *getFromIP(const char*,char*); int main() { FILE *pFileA = fopen("log.txt","rt"); char buff[256]; if(pFileA){ FILE *pFileB = fopen("ip.txt","wt"); if(pFileB){ for(;fgets(buff,256,pFileA) != NULL;){ char buff2[32] = {'\0'}; addLine(getFromIP(buff,buff2),pFileB); } fclose(pFileB); } fclose(pFileA); } return 0; } char *getFromIP(const char *line, char *buff) {  char *src, *dst;        src = strstr(line, "from");  if(src==NULL) { return buff; }   src += 4;            dst = buff;          while(1) {   if(isspace(*src))  {    src++;    continue;          }   else break;         }                    while(1) {   *dst = *src;          if(*dst == ':')        {    *dst = '\0';          break;           }   if(*dst == '\0')       {   break;           }  dst++;            src++;           }  return buff;         } void addLine(const char *str,FILE *pFile){ char buff[1024]; sprintf(buff,"%s\n",str); fputs(buff,pFile); }

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

ソースコードはもう少し読みやすく張って欲しいな。 まず、main関数内でbuff2が宣言されてないようだけど、これは動くコード? それとgetFromIP内では以下の部分で >  if(src==NULL) > { < buff[0]='\0'; > return buff; > }  上記のようにbuffを空文字列にしておかないと空行も出ないと思う。 それで肝心の空行を出さないためにはaddLineで > sprintf(buff,"%s\n",str); の部分を < if (strlen(str)>0) { <  sprintf(buff,"%s\n",str); < } のようにIPが空だったら表示抑制することで対応できる。 サンプルコードを元に簡単に修正するとこんな感じ。 動作確認はしてないので他にも問題はあるかもしれないけど。

masarui
質問者

お礼

ありがとうございました。理想通りにIPが抜き出せるようになりました。 ソースコードに関しましては、文字数オーバーになったため無理やり色々削ったので見にくくなってしまいました^^;

その他の回答 (1)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

fromというのは単純に"from"という文字列ですか?それなら単純に下記の通りでよいのでは… -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { char buf[BUFSIZ], ip[BUFSIZ]; FILE *fin, *fout; if ((fin = fopen("log.txt","r")) == NULL) { fprintf(stderr, "Can't open log.txt\n"); exit (errno); } if ((fout = fopen("ip.txt", "w")) == NULL) { fprintf(stderr, "Can't opem ip.txt\n"); exit (errno); } while (fgets(buf, BUFSIZ, fin) != NULL) { if (sscanf(buf, "from %[^:]", ip) == 1) { fprintf(fout,"%s\n", ip); } } return 0; }

関連するQ&A