- ベストアンサー
文章中から特定の文字列を抜き出すプログラムについて 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); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ソースコードはもう少し読みやすく張って欲しいな。 まず、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が空だったら表示抑制することで対応できる。 サンプルコードを元に簡単に修正するとこんな感じ。 動作確認はしてないので他にも問題はあるかもしれないけど。
その他の回答 (1)
- mac_res
- ベストアンサー率36% (568/1571)
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; }
お礼
ありがとうございました。理想通りにIPが抜き出せるようになりました。 ソースコードに関しましては、文字数オーバーになったため無理やり色々削ったので見にくくなってしまいました^^;