2

このプログラムでは、リダイレクトされたファイル (filetoreadfrom.data) から部分文字列 (コマンド ライン引数で指定) を含む文字列を検索する必要があります。ファイルには、単語 (文字列) のリストが含まれています。文字列に部分文字列が含まれている場合は、文字列を出力します。コマンドラインは次のとおりです。

./program サブストリング < filetoreadfrom.data

「Segmentation-fault (Core dumped )」というエラー メッセージが何度も表示されますが、その理由がわかりません。最初は、char 配列を malloc していないことが原因だと思っていましたが、#define MAXchar 200を使用して char 配列のサイズを修正することでそれを取り除くことができたので、何が問題だったのか本当にわかりません。メモリ スペース、fgets または strstr の使用法、またはファイルのリダイレクト方法に問題があるためですか。

これらは私のコードです:

    char line[MAXchar]; //MAXchar = 200
    int count=0;

    //check usage
    if ((strcmp("<", argv[2]))!=0){
            fprintf(stderr,"Usage: ./program substring\n");
            return 1;
    }

    //read lines from redirected file
    while (fgets(line,MAXchar,stdin)!=NULL){
            //find substring in each line
            //if substring is present in the line
            if (strstr(line,argv[1])!=NULL){
                    //print the line
                    fprintf(stdout, "%s\n", line);
                    count=1;
            }
    }
    //if none of the line contains the substring
    if (count==0){
            fprintf(stdout, "No match found\n");
    }

    return 0;

}

皆さんがこれでいくらか光を当てることができることを願っています. ありがとう!

4

3 に答える 3

2

をチェックするとクラッシュしますargv[2]。はありませんargv[2]<これは、プログラムに渡されないコンソール/シェル固有のコマンドであるためです。argv[2] を確認した時点では NULL ポインターであり、そこに書き込み/読み取りを行う権限がありません。そのため、セグメンテーション違反が発生します。

例えば

#include <stdio.h>
int main(int argc, char** argv)
{
  printf("%d\n", argc);
  return 0;
}

出力:

$ ./test < test.c
1
$
于 2013-08-29T11:59:22.367 に答える
1

< filetoreadfrom.data手段は filetoreadfrom.data as を使用しますstdin

したがって、プログラムは2つのパラメーターしか取得しません:./program substring

あなたのコードでは、この部分を削除してください:

if ((strcmp("<", argv[2]))!=0){
            fprintf(stderr,"Usage: ./program substring\n");
            return 1;
    }

ユーザーが の使用を忘れてしまった場合は、通り過ぎて 開くこと< filetoreadfrom.dataができるかもしれません。filetoreadfrom.data./program substring filetoreadfrom.data

次に、 を使用dupしてファイルの説明を にコピーしますSTDIN_FILENO。またはそれから読むだけです。

をチェックしargc != 3て、ユーザーが入力ファイルを提供していることを確認できます。

于 2013-08-29T12:38:54.193 に答える
0

そのコマンドラインargv[2]NULL. だからライン

if ((strcmp("<", argv[2]))!=0){

セグメンテーション違反が発生します。

あなたはしたいかもしれません

if(argc < 2) {
    //show usage
}
于 2013-08-29T11:59:16.063 に答える