【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22948

文字列検索のプログラム
投稿者---きく(2005/09/04 01:25:30)


ファイル内の文字列を検索するプログラムで、No1259に載っていたのを参考にしたのですが、↓

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
FILE *in_fp;
char line[256];
char *p,*head;
int lineNo=0;
int foundCnt=0;

/*引数の数チェック*/
if(argc != 3){
fprintf(stderr,"使用法:検索ファイル 検索語\n");
return 1;
}

/*ファイルオープン*/
in_fp=fopen(argv[1],"r");
if(in_fp==NULL){
fprintf(stderr,"ファイル[%s]を開くことができません。\n",argv[1]);
return 1;
}

/*読み込んだ一行の先頭アドレスを指すようにしておく*/
p=line;

/*先頭アドレスを保存(何文字目で発見できたかを計算するときに必要)*/
head=line;

/*ファイルエンドまで*/
while(fgets(line,256,in_fp) != NULL){
/*行数カウンタ*/
lineNo++;
/*読み込んだ一行から検索後を探し、その位置を取得*/
p=strstr(line,argv[2]);
/*見つからなければ次の行を読みに行く*/
if(p==NULL){
continue;
}
/*見つかったら、行数と何文字目かを表示する*/
else{
fprintf(stdout,"%d行目:%d文字目\n",lineNo,p-head+1);
/*見つけたときは、カウントしてやる*/
foundCnt++;
}
}

/*検索文字がファイルに1つも存在しなかったとき*/
if(foundCnt==0){
fprintf(stderr,"検索文字[%s]はファイル[%s]に存在しませんでした。\n",argv[2],argv[1]);
return 1;
}

return 0;
}


もし、address.txtというファイルからNameという文字列を検索したい場合にはどの部分にaddress.txtという文字を記入すればいいのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列検索のプログラム 22949 RAPT 2005/09/04 01:43:02
<子記事> Re:文字列検索のプログラム 22950 Hermit 2005/09/04 07:30:44


No.22949

Re:文字列検索のプログラム
投稿者---RAPT(2005/09/04 01:43:02)


fopen



この投稿にコメントする

削除パスワード

No.22950

Re:文字列検索のプログラム
投稿者---Hermit(2005/09/04 07:30:44)


program.exe というプログラムにしたとして、
コマンドラインから、

program address.txt Name

という風に入力すればいいはずです。

プログラム自体に埋め込みたい場合は、
argv[1] -> 読み込むファイル名
argv[2] -> 検索したい文字列
に変更でしょうか。
(コンパイルしなおさなければ変更できないので、普通はしないが)



この投稿にコメントする

削除パスワード

No.22951

Re:文字列検索のプログラム
投稿者---きく(2005/09/04 17:07:37)


>program.exe というプログラムにしたとして、
>コマンドラインから、
>
>program address.txt Name
>
>という風に入力すればいいはずです。

すみません、コマンドラインとはなんでしょう?


>プログラム自体に埋め込みたい場合は、
>argv[1] -> 読み込むファイル名
>argv[2] -> 検索したい文字列
>に変更でしょうか。
>(コンパイルしなおさなければ変更できないので、普通はしないが)


このように直した場合のプログラムを記入していただけないでしょうか?

勉強を始めて2週間であり分からないことがまだまだありすみません。


この投稿にコメントする

削除パスワード

No.22952

Re:文字列検索のプログラム
投稿者---まきじ(2005/09/04 17:17:02)


>すみません、コマンドラインとはなんでしょう?

コマンドプロンプトから「prgram.exe file string」の様にすれば良いです。

>このように直した場合のプログラムを記入していただけないでしょうか?

in_fp=fopen(argv[1],"r"); の argv[1] を "address.txt" にする。
p=strstr(line,argv[2]); の argv[2] を 検索したい文字列にする。


この投稿にコメントする

削除パスワード

No.22953

Re:文字列検索のプログラム
投稿者---きく(2005/09/04 17:40:52)


お返事ありがとうございます!
>p=strstr(line,argv[2]); の argv[2] を 検索したい文字列にする。

とありますが、検索文字列を「Name」として入力してみたところ、

未定義のシンボル Name(関数 main )

と出てしまいました。これはなぜでしょう?


この投稿にコメントする

削除パスワード

No.22954

Re:文字列検索のプログラム
投稿者---まきじ(2005/09/04 17:48:37)


>検索文字列を「Name」として入力してみたところ、
>未定義のシンボル Name(関数 main )
>と出てしまいました。これはなぜでしょう?

Name という変数に格納されてる文字列を検索するなら、
char Name[]="searchstring"; の様に宣言してください。

Name という文字列を検索するなら、ダブルクォーテションで
括弧って、strstr() の第二引数に指定すれば良いです。


この投稿にコメントする

削除パスワード

No.22955

Re:文字列検索のプログラム
投稿者---きく(2005/09/04 20:26:26)


>Name という文字列を検索するなら、ダブルクォーテションで
>括弧って、strstr() の第二引数に指定すれば良いです。

すみません、ダブルクォーてションとはなんですか?


この投稿にコメントする

削除パスワード

No.22956

Re:文字列検索のプログラム
投稿者---まきじ(2005/09/04 20:30:43)


>ダブルクォーてションとはなんですか?

" の事です。

#「テ」の後に 「ー」が抜けてましたね。


この投稿にコメントする

削除パスワード

No.22957

Re:文字列検索のプログラム
投稿者---きく(2005/09/04 20:56:26)


本当にご親切にありがとうございます!!!

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
FILE *in_fp;
char line[256];
char *p,*head;
int lineNo=0;
int foundCnt=0;

/*引数の数チェック*/
if(argc != 3){
fprintf(stderr,"使用法:検索ファイル 検索語\n");
return 1;
}

/*ファイルオープン*/
in_fp=fopen("address.txt" ,"r");
if(in_fp==NULL){
fprintf(stderr,"ファイル[%s]を開くことができません。\n","address.txt" );
return 1;
}

/*読み込んだ一行の先頭アドレスを指すようにしておく*/
p=line;

/*先頭アドレスを保存(何文字目で発見できたかを計算するときに必要)*/
head=line;

/*ファイルエンドまで*/
while(fgets(line,256,in_fp) != NULL){
/*行数カウンタ*/
lineNo++;
/*読み込んだ一行から検索後を探し、その位置を取得*/
p=strstr(line,"Name1");
/*見つからなければ次の行を読みに行く*/
if(p==NULL){
continue;
}
/*見つかったら、行数と何文字目かを表示する*/
else{
fprintf(stdout,"%d行目:%d文字目\n",lineNo,p-head+1);
/*見つけたときは、カウントしてやる*/
foundCnt++;
}
}

/*検索文字がファイルに1つも存在しなかったとき*/
if(foundCnt==0){
fprintf(stderr,"検索文字[%s]はファイル[%s]に存在しませんでした。\n",argv[2],argv[1]);
return 1;
}

return 0;
}

でいいのでしょうか?
これだと「使用法:検索ファイル 検索語」とだけ出て終了してしまいます。なんででしょう…


この投稿にコメントする

削除パスワード

No.22958

Re:文字列検索のプログラム
投稿者---まきじ(2005/09/04 21:01:38)


>これだと「使用法:検索ファイル 検索語」とだけ出て終了してしまいます。

>int main(int argc,char *argv[])

を int main(void) として

>if(argc != 3){
>fprintf(stderr,"使用法:検索ファイル 検索語\n");
>return 1;
>}

を削除すれば良いです。


この投稿にコメントする

削除パスワード

No.22959

Re:文字列検索のプログラム
投稿者---とおり(2005/09/04 21:14:18)


>を削除すれば良いです。

そういう対症療法"だけ"を教えていて、良いとはとても思いませんが。
相手にも、掲示板にとってもね。


この投稿にコメントする

削除パスワード

No.22960

Re:文字列検索のプログラム
投稿者---きく(2005/09/04 21:33:51)


>>を削除すれば良いです。
>
>そういう対症療法"だけ"を教えていて、良いとはとても思いませんが。
>相手にも、掲示板にとってもね。

すみません。そうですね。ご親切に教えてくれたまきじさんまで巻き込むのは悲しいのであとは自分でがんばってみます。まきじさん本当にありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧