

こんにちは。
セグメンテーションエラーが出て困っています。下のプログラムは、strstrによるテキストファイルからの文字列の検索と抽出を目的としたものです。具体的には文字列「00:18:52.491692」を含んだ行を見つけたいと考えています。
何かお気づきの点等ありましたら是非ご教授頂きたく思います。
#include<stdio.h>
#include<string.h>
int main(){
FILE *fp;
if( (fp = fopen("file.txt","r")) == NULL){
printf("fopen:error\n");
exit(-1);
}
char *answer;
char target[1024] = "00:18:52.491692";
char source[1024];
while( (fgets(source,1024,fp)) != NULL){
answer = strstr(source,target);
if(answer != NULL){
printf("%s\n",answer);
break;
}
}
fclose(fp);
return 0;
}
以下がファイルの中身です。
00:18:52.486843 IP (tos 0x10, ttl 64, id 56604, offset 0, flags [DF], proto: TCP (6), length: 100) 10.1.4.12.ssh > 10.1.4.99.49964: P 1724257568:1724257616(48) ack 648002683 win 718 <nop,nop,timestamp 2123242756 28297809>
00:18:52.491692 IP (tos 0x10, ttl 64, id 56605, offset 0, flags [DF], proto: TCP (6), length: 164) 10.1.4.12.ssh > 10.1.4.99.49964: P 48:160(112) ack 1 win 718 <nop,nop,timestamp 2123242756 28297809>
00:18:52.486957 IP (tos 0x10, ttl 64, id 31393, offset 0, flags [DF], proto: TCP (6), length: 52) 10.1.4.99.49964 > 10.1.4.12.ssh: ., cksum 0xce39 (correct), 1:1(0) ack 48 win 501 <nop,nop,timestamp 28297832 2123242756>
00:18:52.486985 IP (tos 0x10, ttl 64, id 31394, offset 0, flags [DF], proto: TCP (6), length: 52) 10.1.4.99.49964 > 10.1.4.12.ssh: ., cksum 0xcdc9 (correct), 1:1(0) ack 160 win 501 <nop,nop,timestamp 28297832 2123242756>
00:18:52.487816 IP (tos 0x0, ttl 64, id 7429, offset 0, flags [DF], proto: UDP (17), length: 68) 10.1.4.12.32986 > 10.1.4.1.domain: [bad udp cksum 7869!] 63212+ PTR? 99.4.1.10.in-addr.arpa. (40)
どんな些細な意見でもいいので、皆さんのお力を貸して頂けないでしょうか。どうぞよろしくお願いします。
No.1ベストアンサー
- 回答日時:
拙者宅では、stdlib.hをインクルードするだけで、動きましたけよ。
# exit()を使用するには、stdlib.hが必要なのに、ないからコンパイルエラーになりましたよ。
ただ、疑わしい個所があるので、念のため修正しておきました。
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> // 追加
#include <string.h>
int main(){
FILE *fp;
if( (fp = fopen("file.txt","r")) == NULL){
printf("fopen:error\n");
exit(-1);
return -1;
}
char *answer;
char target[1024] = "00:18:52.491692";
char source[1024];
char printbuffer[1024];// 追加
while( (fgets(source,1024,fp)) != NULL){
answer = strstr(source,target);
if(answer != NULL){
strcpy(printbuffer, answer);// 追加
printf("%s\n", printbuffer);// 変更
break;
}
}
fclose(fp);
return 0;
}
----------------------------------------------------------------------
strstr()の戻り値を、直接printf()に渡してよいかどうかは、疑問。
stdlibファイルは単にこのサイトにコピペするのを忘れておりました。混乱を招きましたこと深くお詫び申し上げます。
お騒がせしております本プログラムですが、時間を置いてまた実行してみますと結果はすんなり実行出来ました。しかし、何が原因だったのかは全くもって不明のままです。
たまにこういう事が私の環境ではあるようで、コンパイルして出来たa.outを実行しても、「前にコンパイルして出来た」a.outを実行してしまう事が何度かありました。つまり、既存のa.outファイルが正常に上書きされない事があるようなんです。これに気づいた場合は-oオプションで出力名を変える事で解決しているのですが・・、一体なんでしょうね、この現象は。
最後になりますが、Yanchさんを始めとする皆さんのご回答、及び御高察に深く感謝いたします。有難う御座いました。
No.5
- 回答日時:
プログラム実行しましたがエラー出ませんねぇ・・・
コンパイル時も stdlib.h だけでしたし。
これないと exit が使えないはずです。
まさか筆問者の環境がexit未定義のエラーを出さずにビルドしてしまって、
file.txt がなくて exit(1) が実行されて・・・とかあるのでしょうか?
補足:セグメンテーションエラー(セグメンテーション違反)について
http://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0% …
書き込みできないメモリに書き込もうとすると出るエラーのようです。
No.4
- 回答日時:
#1/#2両氏のように動かした訳ではないですが、見た限りでもコード自体には問題がないように見えます。
#インクルード忘れは置いておくとして
とりあえず環境(OS、コンパイラ)は明示しましょう。
あとはステップ実行等で「どこで、何が」エラー原因になっているかを突き止めておくとエラー解析がやりやすいです。
> #3
> answer = ("00:18:52.491692" を含む行の内容);
より正確にというか一般的な書き方をすると
answer = ("00:18:52.491692" を含む行の、"00:18:52.491692"以降);
ですね。
strstr()は検索文字列がヒットした場合、ヒット位置のアドレスを返しますから。
今回はたまたま行頭な訳ですが、ってこれならstrncmp()でいいような気がしますねぇ。
No.3
- 回答日時:
>answer = "00:18:52.491692";
あ、正確には、
answer = ("00:18:52.491692" を含む行の内容);
ってことです。
No.2
- 回答日時:
>#1さん
> strstr()の戻り値を、直接printf()に渡してよいかどうかは、疑問。
全く問題ありません。
strstr() の戻り値は単なる char *型で、詰まるところ
answer = "00:18:52.491692";
としたのと同じことですから。
あ、ちなみに、うちの環境(Borland C++とg++)でもちゃんと動きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
strtok
-
#defineが使用するメモリ領域に...
-
プログラミングの授業の課題です
-
VC++2008Enterpriseでwinsockを...
-
算術型変換について
-
空白を含んだ文字列がうまく格...
-
C言語で複数列のデータを1列の...
-
char型2つを結合し、short型に...
-
【C言語】全角文字の配列を、全...
-
WinInetのInternetOpenUrl関数...
-
C言語
-
構造体の各メンバにfor文からア...
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
ラグランジュの補間法のCプログ...
-
10個出力で改行したいのですが...
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
なぜCSQとCIP形式ではコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報