- ベストアンサー
文字列の配列
文字列の配列 1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 のようにIPアドレスが一行に一つづつ書き込まれたテキストがあります。 ここから、それぞれのIPアドレスを文字列として配列に書き込みたいのですが、どうしたらよいのでしょうか。 IPアドレスの数だけ配列を始めに宣言して、それぞれに書き込んでいくのでは手間がかかりすぎてしまいます。 単純に数値の羅列なら scanfを使い、配列に格納できるのですが、文字列になるとどうしたらいいのかわかりません。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
余計な口出しかも……。 「対ででしなければならい処理」というのは、たとえば、オープンとクローズです。 処理の流れの中で、どちらかが連続すると、良くないことが起こります。 (オープンが連続しても、あんまり実害は見えませんが) ついでにいえば、while(C=getc(FP),!feof(FP)) というのは、いかにも、「誰かがファイルの読み込みで使ったプログラムの丸写し」という感じがしますが、この行があると、良くないことが起こります。 (たとえば、C に代入されるはずのデータは何で、それが使われずにいるのはいいのかとか)
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
「何がまずい」って.... 世の中には「対になって実行しなければならない処理」というのがあるんだが, 理解できてるか? あと, 「動きません」とだけ書いてあとは他者の超能力まかせというのはいかがなものかね. 「どういう入力を与えたのか」「それに対しどのような結果を期待したのか」「実際にはどうなったのか」くらいは書こうよ.
補足
補足が不十分で申し訳ありません。 ついになって実行しなければならない処理とは理解できていません。 それぞれのファイルを入力として与えました。 結果は、dl-ip,uniq1を読み込んで、dl-ip中の出現したIPアドレスごとに、重複して出現した数をカウントすることを期待しました。 しかし、実際には ***glibc detected *** ./coutn-ip2: double free or corruption (!prev): 0x9009008 *** となり 以下 BackTrce: とか Memorymap とかがでてきてなにがおきているのかよくわかりませんでした。
- koko_u_u
- ベストアンサー率18% (216/1139)
>IPアドレスの数だけ配列を始めに宣言して、それぞれに書き込んでいくのでは手間がかかりすぎてしまいます。 では、まずはその「手間のかかる」コードを補足にどうぞ。
補足
すいません、別の上とは別の方法でやることにしました。一応コードは書いたのですが、動きません。dl-ipが、重複を含むIPアドレスの書き込まれたテキストで、uniq1がそこから重複を取り除いたテキストです。uniq1から、IPアドレスを読み込んで、それをdl-ip中で検索することにしたのですが、動きません。なにがまずいんでしょうか?よろしくお願い致します。 #include <stdio.h> #include <stdlib.h> #include <string.h> // IPアドレスの出現回数をカウントする int main(int argc,char *argv[]) { FILE *fp; FILE *FP; char tmp[16]; char ip[16]; long n=0; int c ,C; fp = fopen("dl-ip","r"); FP = fopen("uniq1","r"); if(fp == NULL){ printf("can not open the fp file.\n"); return 1; } if(FP == NULL){ printf("can not open the FP file.\n"); return 1; } while(C=getc(FP),!feof(FP)){ fscanf(FP,"%s",tmp); while(c=getc(fp),!feof(fp)){ fscanf(fp,"%s",ip); if(!strcmp(tmp,ip)) n++; } printf("%s:%ld\n",tmp,n); fclose(fp); } fclose(FP); return 0; }
お礼
回答ありがとうございます。オープン、クローズが連続するとまずいとは知りませんでした。 いろいろアドバイスありがとうございます。ただ別の方法を思いついてそれでコードがかけました。