カレントディレクトリ内の検索

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
天和

カレントディレクトリ内の検索

#1

投稿記事 by 天和 » 15年前

使用OS Mac
コンパイラ GCC
技術レベル fopenが使える程度。



前回の投稿で(URL http://www.play21.jp/board/formz.cgi?ac ... &rln=45491
(課題はカレントディレクトリ内にある.cファイルのすべてを対象にしてその次に検索したい言葉を入力して
ファイル名と検索したい言葉がある行の文章そしてその行の行数を出力するプログラムを作りなさい。 )
解決しましたといっときながらなんですが・・・
以下のようにプログラムを組んだのですが
#include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fp;/*検索対象になるファイル*/
FILE *fl;/*filelist用*/
int ch;/*putchar用*/
int che;/*putchar用(filelist用の)*/
int h, i, j, k, n, s;
int count;/*文字の判定*/
int count2;/*行の文字数*/
int count3;/*forループ用*/
int flag;/*判定*/
char fname[1024];/*検索したいファイル名*/
char word[1024];/*検索したい文字列*/
char string[1024];/*文字を格納する場所*/
h = 0;/*ファイル名用*/
i = 0;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が今何文字あってるか?*/
s = 0;/*検索したい文字数*/
count = 0;

system("ls *.c > filelist");

printf("検索したい文字は?");
scanf("%s", word);

while(1){
     if(word[j] == '\0')
        break;
    s++;
    j++;
}

j = 0;

if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
   printf("ERROR\n");

else{

while((che = fgetc(fl)) != EOF){

       if(che == '\n' || che == EOF){
/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
            fname[h] = '\0';
                printf("%s\n", fname);

     h = 0;
     i = 0;
     j = 0;
     n = 0;
     s = 0;
     count = 0;
     count2 = 0;
     count3 = 0;

if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
           printf("ERROR2\n");

else{

i++;/*最初の行数*/

while((ch = fgetc(fp)) != EOF){

    string[count2] = ch;
    count2++;

if(count == 0)/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
{

      j = 0;
      n = 0;

}

if(ch == '\n')/*もし改行なら行番号をあげなさい*/
     {
       i++;
        string[count2] = '\0';

            if(flag == 1){
             count3 = 0;/*forループに使用*/
         
                 for(;count3 < count2 + 1; count3++)
                    printf("%c", string[count3]);

                          }

      count2 = 0;
      flag = 0;
     }
}

fclose(fp);
}
    }
       fname[h] = che;
       h++;
  }
}

fclose(fl);
return 0;
}
エラーが出ないはいいのですが上のソースを実行すると

検索したい文字は?printf
2-11.c
2-7.c
ERROR2

3-11.c
ERROR2

3-11a.c
ERROR2

3-14.c
ERROR2

3-15.c
ERROR2

3-16.c
ERROR2

3-18.c
ERROR2

4-13.c
ERROR2

az.c
ERROR2

bubble.c
ERROR2

copy.c
ERROR2

ennsyuu3-1.c
ERROR2

exlexico.c
ERROR2

file.c
ERROR2

fopen.c
ERROR2

fopen2.c
ERROR2

fopen3.c
ERROR2

fscanf.c
ERROR2

ifbun.c
ERROR2

kouzoutai.c
ERROR2

list13-10.c
ERROR2

list13-6.c
ERROR2

list13-9.c
ERROR2

search.c
ERROR2

switch.c
ERROR2

switch2.c
ERROR2

syukudai.c
ERROR2

test.c
ERROR2

time.c
ERROR2
と出てしまいます(最初の.cファイルだけなぜかエラーが出ませんが)
カレントディレクトリ内のファイル名はきちんと出ているので
ファイル名を検索するとき多分文字のデータとして扱われてないんじゃないかと思われるのですが。
(if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
printf("ERROR2\n");  のとき)
最初にERROR2と表示されずきちんと表示されているファイル名のファイル内の検索をする対処法をお願いします。


画像

box

Re:カレントディレクトリ内の検索

#2

投稿記事 by box » 15年前

インデントにポリシーがないため、ソースが見づらくて仕方ありません。
まずはそこから手をつけてみてはいかがでしょう。

天和

Re:カレントディレクトリ内の検索

#3

投稿記事 by 天和 » 15年前

>boxさん
編集>再インデントとやってみましたが
(なんかコメントがちょっと見づらいので勝手に自分で改行とかしてますが)
#include<stdio.h>
#include<stdlib.h>
int main(void){
    FILE *fp;/*検索対象になるファイル*/
    FILE *fl;/*filelist用*/
    int ch;/*putchar用*/
    int che;/*putchar用(filelist用の)*/
    int h, i, j, k, n, s;
    int count;/*文字の判定*/
    int count2;/*行の文字数*/
    int count3;/*forループ用*/
    int flag;/*判定*/
    char fname[1024];/*検索したいファイル名*/
    char word[1024];/*検索したい文字列*/
    char string[1024];/*文字を格納する場所*/
    h = 0;/*ファイル名用*/
    i = 0;/*行数用の数字*/
    j = 0;/*j番目の文字列*/
    n = 0;/*検索したい文字列が今何文字あってるか?*/
    s = 0;/*検索したい文字数*/
    count = 0;
    
    system("ls *.c > filelist");
    
    printf("検索したい文字は?");
    scanf("%s", word);
    
    while(1){
        if(word[j] == '\0')
            break;
        s++;
        j++;
    }
    
    j = 0;
    
    if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
        printf("ERROR\n");
    
    else{
        
        while((che = fgetc(fl)) != EOF){
            
            if(che == '\n' || che == EOF){/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
                fname[h] = '\0';
                printf("%s\n", fname);
                
                h = 0;
                i = 0;
                j = 0;
                n = 0;
                s = 0;
                count = 0;
                count2 = 0;
                count3 = 0;
                
                if((fp = fopen(fname, "r")) == NULL)
/*fname内の文字データと同じファイル名が存在するかチェックする*/
                    printf("ERROR2\n");
                
                else{
                    
                    i++;/*最初の行数*/
                    
                    while((ch = fgetc(fp)) != EOF){
                        
                        string[count2] = ch;
                        count2++;
                        
                        if(count == 0)
/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
                        {
                            
                            j = 0;
                            n = 0;
                            
                        }
                        
                        if(ch == '\n')/*もし改行なら行番号をあげなさい*/
                        {
                            i++;
                            string[count2] = '\0';
                            
                            if(flag == 1){
                                count3 = 0;/*forループに使用*/
                                
                                for(;count3 < count2 + 1; count3++)
                                    printf("%c", string[count3]);
                                
                            }
                            
                            count2 = 0;
                            flag = 0;
                        }
                    }
                    
                    fclose(fp);
                }
            }
            fname[h] = che;
            h++;
        }
    }
    
    fclose(fl);
    return 0;
}

たかぎ

Re:カレントディレクトリ内の検索

#4

投稿記事 by たかぎ » 15年前

前回までの内容を追っていないのでよくわかりませんが...

system関数でlsコマンドを呼び出すのであれば、grepコマンドを読んだほうが手っ取り早くないですか?

box

Re:カレントディレクトリ内の検索

#5

投稿記事 by box » 15年前

「検索したい文字は?」

で入力した文字列を全然使ってないんですけど…。
使わなくていいんですか?

天和

Re:カレントディレクトリ内の検索

#6

投稿記事 by 天和 » 15年前

>boxさん
すいませんチェックしたときエラーがなかったものですからつい忘れてしまいました以下が修正したものです。
#include<stdio.h>
#include<stdlib.h>
int main(void){
    FILE *fp;/*検索対象になるファイル*/
    FILE *fl;/*filelist用*/
    int ch;/*putchar用*/
    int che;/*putchar用(filelist用の)*/
    int h, i, j, k, n, s;
    int count;/*文字の判定*/
    int count2;/*行の文字数*/
    int count3;/*forループ用*/
    int flag;/*判定*/
    char fname[1024];/*検索したいファイル名*/
    char word[1024];/*検索したい文字列*/
    char string[1024];/*文字を格納する場所*/
    h = 0;/*ファイル名用*/
    i = 0;/*行数用の数字*/
    j = 0;/*j番目の文字列*/
    n = 0;/*検索したい文字列が今何文字あってるか?*/
    s = 0;/*検索したい文字数*/
    count = 0;
    
    system("ls *.c > filelist");
    
    printf("検索したい文字は?");
    scanf("%s", word);
    
    while(1){
        if(word[j] == '\0')
            break;
        s++;
        j++;
    }
    
    j = 0;
    
    if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
        printf("ERROR\n");
    
    else{
        
        while((che = fgetc(fl)) != EOF){
            
            if(che == '\n' || che == EOF){
/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
                fname[h] = '\0';
                printf("%s\n", fname);
                
                h = 0;
                i = 0;
                j = 0;
                n = 0;
                s = 0;
                count = 0;
                count2 = 0;
                count3 = 0;
                
                if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
                    printf("ERROR2\n");
                
                else{
                    
                    i++;/*最初の行数*/
                    
                    while((ch = fgetc(fp)) != EOF){
                        
                        string[count2] = ch;
                        count2++;
                        
                        if(count == 0)
/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
                        {
                            
                            j = 0;
                            n = 0;
                            
                        }
                        if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
                            
                        {
                            
                            n++;/*同じ文字かの正解数を1つあげる*/
                            
                            count++;/*現在の文字が正解か否かの判定*/
                            
                            j++;/*検索したい次の文字にチャレンジする*/
                            
                        }
                        
                        else{
                            
                            count = 0;
/*不合格なので検索したい最初の文字からやり直し*/
                            
                        }
                        
                        
                        
                        if(s == n){
/*もし検索したい文字数と正解数が一緒ならその行番号を出力しなさい*/
                            
                            printf("%d:", i);
                            
                            flag = 1;
                            
                            j = 0;
                            
                            n = 0;
                            
                        }
                        
                        if(ch == '\n')/*もし改行なら行番号をあげなさい*/
                        {
                            i++;
                            string[count2] = '\0';
                            
                            if(flag == 1){
                                count3 = 0;/*forループに使用*/
                                
                                for(;count3 < count2 + 1; count3++)
                                    printf("%c", string[count3]);
                                
                            }
                            
                            count2 = 0;
                            flag = 0;
                        }
                    }
                    
                    fclose(fp);
                }
            }
            fname[h] = che;
            h++;
        }
    }
    
    fclose(fl);
    return 0;
}
ちなみにまだERROR2の所でつまずいているためキチンと行番号が出るとかの確認とかしていません。

>たかぎさん
> 前回までの内容を追っていないのでよくわかりませんが...
>system関数でlsコマンドを呼び出すのであれば、grepコマンドを読んだほうが手っ取り早くないですか?
grep -n while ./*cとかだと確かに出せますがプログラムでやると1種類の言葉でしかできませんよね?
greo -n word(検索したい文字データが入っている配列)./*cみたいにできませんし
あとなるべくgrepは禁止の方向でお願いします。

qwerty

Re:カレントディレクトリ内の検索

#7

投稿記事 by qwerty » 15年前

>>たかぎさん
>grepコマンド
Unix系ではこのような便利なコマンドがあるんですね。
初めて知りました。
確かにこのコマンドを利用すれば天和さんの求めている動作を容易に実現できそうです。

>>天和さん
>プログラムでやると1種類の言葉でしかできませんよね
入力された文字列をsprintfなどで配列変数に格納し、
それをsystem関数に引数として渡してやれば出来そうですよ。

box

Re:カレントディレクトリ内の検索

#8

投稿記事 by box » 15年前

1文字ずつ読んではチェックしていく、というのは
いかにも効率が悪そうです。

1行分を丸ごと読んで、strstrあたりの関数を使って検索する方が
よほど効率的ではないかと思います。

たかぎ

Re:カレントディレクトリ内の検索

#9

投稿記事 by たかぎ » 15年前

grepを使わないとして...

> 1行分を丸ごと読んで、strstrあたりの関数を使って検索する方が
> よほど効率的ではないかと思います。

fgets等でいちいち読み込むより、mmapでファイルの内容をメモリにマッピングして操作した方が簡単かと思います。

box

Re:カレントディレクトリ内の検索

#10

投稿記事 by box » 15年前

mmapは初めて知りました。

機会が訪れれば使ってみようと思います。
永遠に訪れないかもしれませんが…。

天和

Re:カレントディレクトリ内の検索

#11

投稿記事 by 天和 » 15年前

>boxさん
そんな便利な関数あったんですねありがとうございます。
そして早速作ってみたのですが
#include<stdio.h>

int main(void)

{
    
    char *ch;
    
    FILE *fp;
    
    char fname[99]; /*検索したいファイル名*/
    
    char word[99]; /*検索したい文字列*/
    
    char string[1024];/*検索対象になる文字列*/
    
    int i, n;
    
    
    
    i = 0;/*行数用の数字*/
    
    n = 1024;/*fgetsで使う*/
    
    
    printf("FILEname?\n");
    
    scanf("%s", fname);
    
    printf("検索したい文字は?");
    
    scanf("%s", word);
    
    if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
        
        printf("ERROR");
    
    else{
        i++;
        
        while((ch = fgets(string, n, fp)) != EOF)
        {
            
            if((ch = strstr(ch,word)) != NULL){
                printf("%d:", i);
                puts(ch);
            }
            i++;
        }
        
        
        
    }
    
    fclose(fp);
    
    
    
    return 0;
    
}
エラーは出ませんが警告はでます。
(警告内容)
search.c:42: warning: comparison between pointer and integer
search.c:45: warning: incompatible implicit declaration of built-in function ‘strstr’

(出力結果)
FILEname?
fopen.c
検索したい文字は?printf
25:printf("検索したい文字は?");

38:printf("ERROR\n");

46:printf("%s\n", fname);

58:printf("ERROR2\n");

98:printf("%d:", i);

117:printf("%c", string[count3]);

Bus error
>たかぎさん
すいません今回はそのstrstrの方向でいかせていただきます。
>qwertyさん
>入力された文字列をsprintfなどで配列変数に格納し、
それをsystem関数に引数として渡してやれば出来そうですよ。

まあでもgrepは使ってはいけませんから・・・。

box

Re:カレントディレクトリ内の検索

#12

投稿記事 by box » 15年前

> (警告内容)
> search.c:42: warning: comparison between pointer and integer

> while((ch = fgets(string, n, fp)) != EOF)

ファイルを読み終わったときにfgetsは何を返すのでしょうか? EOFでしょうか?

> search.c:45: warning: incompatible implicit declaration of built-in function ‘strstr’

strstr関数の引数の型(constがらみ)の話だと思います。
画像

たかぎ

Re:カレントディレクトリ内の検索

#13

投稿記事 by たかぎ » 15年前

> strstr関数の引数の型(constがらみ)の話だと思います。

違うでしょう。
関数原型なしでstrstrを呼び出しているので、

int strstr();

とみなされるわけですが、これは組み込み関数のシグニチャと矛盾することが指摘されているのです。

しえる

Re:カレントディレクトリ内の検索

#14

投稿記事 by しえる » 15年前

すみません天和さんへの私信です。

以前こちらの投稿を見たのですが。
http://www.play21.jp/board/formz.cgi?ac ... &rln=45023
mygrep.plの動作は天和さんの理解されているものとは違うと思いますよ。
># Usage: mygrep pattern file1 file2 ...
と書かれてますので、コマンドプロンプトからこんな感じに使う想定です。

mygrep printf main.txt main2.txt
→main.txtとmain2.txtからprintfを探す

出題者の方がいるなら確認してみるのをお勧めします。

あとついでに、
grep -n while ./*.c
の"./*.c"はワイルドカードというもので、
こう指定するとどうなるのかも聞いてみた方がいいかも。

初心者にはかなり難しい問題です。

天和

Re:カレントディレクトリ内の検索

#15

投稿記事 by 天和 » 15年前

>しえるさん
えーと今回の課題は$ grep -n 文字列 ファイル名と同じ効果をもつプログラムを作りなさい
ということなのでよくわからないので教授に「ようするにカレントディレクトリ内にある.cファイル例えば
printfならprintfと書かれている文字列を行番号付きで出せとのことでしょうか?」
と聞いたら「はいそうです」といったので上のようなソースを作った訳なんですけど
ちなみに教授はそれをPerl言語で書くと
# grep for perl version
# Usage: mygrep pattern file1 file2 ...
#

if (@ARGV < 1) {
    die "Usage: mygrep pattern [file..]\n";
}

$pattern = shift;
foreach $file (@ARGV) {
    open(FILE, $file);
    $line = 1;
    while (<FILE>) {
    print "$file $line: $_" if /$pattern/o;
    $line++;
    }
    close(FILE);
}
と同じになるっていってたんですけど間違えたんでしょうか?

qwerty

Re:カレントディレクトリ内の検索

#16

投稿記事 by qwerty » 15年前

>>天和さん
>間違えたんでしょうか?
大筋は合っていると思いますが、少し無駄に拡大解釈しているのだと思います。

課題の内容は“コマンドラインから受け取ったファイル名”を対象として、そのファイルに対し検索を実行するようです。
それをあたかもワイルドカードまで考慮して実装しなくてはならないような解釈をしておられるようなので、
話がややこしくなっているのだと思います。

天和

Re:カレントディレクトリ内の検索

#17

投稿記事 by 天和 » 15年前

>qwertyさん
あっじゃあ自分はこの課題の大部分はすでにできているということでしょうか?
(ファイルをひとつ指定して検索するプログラムはできているため)
まあ今度はコマンドラインからの入力で反応できなきゃだめですが・・・
(scanfをつかってファイル指定しているため)

たかぎ

Re:カレントディレクトリ内の検索

#18

投稿記事 by たかぎ » 15年前

Perlのコードを見る限り、パターンやファイル名の指定はコマンドライン引数で与える必要があるのではないでしょうか?
だとすれば、ワイルドカードの扱いも簡単に解決できます。
それより、Perlのコードに合わせるためには、正規表現も必要になります。非標準の関数を使ってもよいのかどうか知りませんが、非標準関数を使わずに正規表現を実装するのは大変です。
仮に非標準関数を使ってもよいとしても、Perlの正規表現と同じ動作にするのは困難です。いっそ、system関数でPerlを呼び出した方がよいと思います。

天和

Re:カレントディレクトリ内の検索

#19

投稿記事 by 天和 » 15年前

>たかぎさん
つまりsystem関数で
if (@ARGV < 1) {
    die "Usage: mygrep pattern [file..]\n";
}

$pattern = shift;
foreach $file (@ARGV) {
    open(FILE, $file);
    $line = 1;
    while (<FILE>) {
    print "$file $line: $_" if /$pattern/o;
    $line++;
    }
    close(FILE);
}
を呼び出せということでしょうか?

qwerty

Re:カレントディレクトリ内の検索

#20

投稿記事 by qwerty » 15年前

>>たかぎさん
対象ファイルにしか目が行ってませんでしたが、たしかに検索文字列に正規表現が使われていますね。
「同等以上」のプログラムとなると難しそうです。

たかぎ

Re:カレントディレクトリ内の検索

#21

投稿記事 by たかぎ » 15年前

> つまりsystem関数で
> (中略)
> を呼び出せということでしょうか?

まあ、そういうことです。
強引にワンライナーで呼び出してください。
grepは使いたくないけれど、PerlならOKですよね。

天和

Re:カレントディレクトリ内の検索

#22

投稿記事 by 天和 » 15年前

>たかぎさん
もしかしてそれって
perl mygrep.pl while ./*.cってやつでしょうか?
それだとしたたぶんだめです課題のプリントにすでに書いてあるので・・・。
(mygrep.plは上のperl言語のソースコードが書いてあるファイルです)

たかぎ

Re:カレントディレクトリ内の検索

#23

投稿記事 by たかぎ » 15年前

> もしかしてそれって
> perl mygrep.pl while ./*.cってやつでしょうか?

違います。

system("perl -e \'スクリプト\'");

のように、system関数を使って呼び出してください。
@ARGVを使う必要はないので、スクリプトに必要なパラメータを直接埋め込めばよいでしょう。

天和

Re:カレントディレクトリ内の検索

#24

投稿記事 by 天和 » 15年前

すいません自分perl言語なんてやったことないのでよくわからないのですが。
文字検索するワンライナーとはどんなのでしょうか?
逆ならあったのですが・・・
参考URL
http://dyno2316.blogspot.com/2009/07/bl ... _3805.html
# '@'が含まれていない行を表示
perl -ne "print unless /@/" aaa.txt

たかぎ

Re:カレントディレクトリ内の検索

#25

投稿記事 by たかぎ » 15年前

> すいません自分perl言語なんてやったことないのでよくわからないのですが。
> 文字検索するワンライナーとはどんなのでしょうか?

話すと長くなるので、Perlの解説サイトでも見てください。

hoge

Re:カレントディレクトリ内の検索

#26

投稿記事 by hoge » 15年前

> すいません自分perl言語なんてやったことないのでよくわからないのですが。
> 文字検索するワンライナーとはどんなのでしょうか?
> 逆ならあったのですが・・・

同じページにあるじゃん。

# grepのように使う
perl -ne "print if (/検索パターン/)" filename

天和

Re:カレントディレクトリ内の検索

#27

投稿記事 by 天和 » 15年前

>hogeさん
あっホントですね。
でもこのままだと特定のひとつのファイルまたはカレントディレクト内全部検索できるのはいいですが
行番号とファイル名が・・・
なのでとりあえずファイル名を文字データとして代入させてやる感じにしないといけないわけですが。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char fname[1025];
scanf("%s" fname);
system("perl -ne 'print if while' fname");
return 0;
}
だとfnameというファイルを探してしまうんですがfname内にある文字データで検索させるにはどうすればいいんでしょう?

box

Re:カレントディレクトリ内の検索

#28

投稿記事 by box » 15年前

> > strstr関数の引数の型(constがらみ)の話だと思います。
>
> 違うでしょう。
> 関数原型なしでstrstrを呼び出しているので、

はい。大間違いでした。
string.hをインクルードしていなかったからですね。

天和

Re:カレントディレクトリ内の検索

#29

投稿記事 by 天和 » 15年前

YAHOO知恵袋に答えらしきものがあったのですが・・・
http://detail.chiebukuro.yahoo.co.jp/qa ... 1035210505
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void
grep_file(const char *file, const char *pattern)
{
FILE *fp;
int line;
char buf[BUFSIZ];

/* ファイルをオープンする */
fp = fopen(file, "r");
if (fp == NULL)
{
/* ファイルのオープンに失敗 */
return;
}

line = 1;

/* 注意
下記のコードは簡易版です。バイト数が BUFSIZ を超える行がある場合、
正しく動作しません。但し、この課題が、C言語初学者用のものである
ならば、十分な内容です。*/

/* ファイルから一行ずつ取り出しながら処理する */
while (fgets(buf, sizeof(buf), fp) != NULL)
{
/* buf の中に pattern があれば、strstr() は NULL 以外を返す */
if (strstr(buf, pattern) != NULL)
{
printf("%s %d: %s", file, line, buf);
}

++line;
}

/* 開いたファイルを閉じる */
fclose(fp);
}

int
main(int argc, char *argv[/url])
{
int i;

/* 引数が何も指定されていない場合 */
if (argc <= 1)
{
printf("Usage: mygrep pattern [file...]\n");
return EXIT_FAILURE;
}

/* 二番目以降の引数をファイル名とみなし、それらを一つずつ処理する */
for (i = 2; i < argc; ++i)
{
/* 第一引数にファイル名、第二引数にパターンを指定して
grep_file() 関数を呼び出す。*/
grep_file(argv, argv[1]);
}

return EXIT_SUCCESS;
}

(ちなみに知恵袋の質問者は自分じゃありません)

なんかワンライナーとか使わなくてもできそうですね

たかぎ

Re:カレントディレクトリ内の検索

#30

投稿記事 by たかぎ » 15年前

> なんかワンライナーとか使わなくてもできそうですね

(Perl式の)正規表現が使えないので、できたとはいわないのでは?

天和

Re:カレントディレクトリ内の検索

#31

投稿記事 by 天和 » 15年前

>たかぎさん
知恵袋のほうだと正規表現スルーしてますねたしかに
でも問題文といいファイル名といいたぶん自分の大学と同じ人だと思うんですけどね。
でもうちの教授何もいわなかったんですよね(正規表現のありなしを)せいぜい
「力技でもいいよ」とはいったんですが。
やっぱりワンライナーで真面目にやるしかないですよね?

たかぎ

Re:カレントディレクトリ内の検索

#32

投稿記事 by たかぎ » 15年前

> でもうちの教授何もいわなかったんですよね(正規表現のありなしを)せいぜい
> 「力技でもいいよ」とはいったんですが。

Perlならこうなるというコードを示されていますから、正規表現は当然必要です。
正規表現不要なら、Perlのコードでも正規表現が働かないように実装しなければなりませんから。
「力技」が何を意味するのかわかりませんが、Perlをワンライナーで呼び出すのは十分力技です。

天和

Re:カレントディレクトリ内の検索

#33

投稿記事 by 天和 » 15年前

>たかぎさん
perlをワンライナーで呼び出すって結構力技だったんですね
初めてやってる自分からするとかなり新鮮なかんじがしたんですが。
そして話し変えますけど、次、どうすればいいんでしょうか?
perl -ne "print if (/検索パターン/)" filename
だと文字は出してくれてもファイル名と行数は出してくれませんし・・・
(自分がPerlをワンライナーで呼び出すってことを勘違いしてるだけかもしれませんが)

天和

Re:カレントディレクトリ内の検索

#34

投稿記事 by 天和 » 15年前

今日教授に聞いたところ正規表現のほうはスルーしてもいいみたいのなので
YAHOO知恵袋を参考に作りたいと思いますので解決とさせていただきます。
お手数とらせて申し訳ありません。
画像

閉鎖

“C言語何でも質問掲示板” へ戻る