2016-12-09 13 views
0

私はファイルを読み、単語を数えたいと思う。コマンドラインでファイルが入力されない場合は、ファイル名を取得して読み取るif文をトリガーしてから、その単語を数えさせるために、コマンドラインを使用するように設定します。コマンドラインでファイル名を入力すると動作しますが、使用しなければフォールトが発生します。条件はargc次に、一般的な場合にargcは1に等しく、C標準argv[argc]によればNULLに等しい実際2以上である場合であることは事実である場合if文でsegフォルトが発生するのはなぜですか?

int main(int argc, char **argv) 
{ 
    char file[75]; 
    if (argc < 2) 
    { 
     cout << "Please enter the filename: "; 
     cin >> file; 
     strcpy(argv[1], file); 
    } 
    string content; 
    ifstream inFile(argv[1]); 
    int count = 0; 
    while (inFile >> content) 
     count++; 
    inFile.close(); 
    display(count, argv); 
    return 0; 
} 
+4

fileを変更する場合は、より良いこれはUBであるcin.getline(file)またはstd::getline(cin, file)を使用するので、ファイル名は、それらを持つことができます: 'strcpyの(ARGV [1]、ファイル) ; ' – drescherjm

+6

'argc'が2より小さい場合、' argv'の有効なインデックスは何ですか? – NathanOliver

+0

セグメンテーションフォールトが発生した後、デバッガを使用してコードに侵入しようとしましたか?それが何を伝えましたか?デバッガを使うことを学ぶことは非常に良い習慣です。あなたはあなたが将来あなた自身のためにこれを理解できたかを確かめるために、あなたがここで答えを得た後でさえ試してみるべきです。 –

答えて

1

:ここでは、コードです。

この場合、プログラムには未定義の動作があります。

いずれの場合でも、ソース文字列がターゲット文字列よりも大きくなる可能性があるため、文字列をargv [n]にコピーすることは悪い考えです。

argv[1]fileにコピーする逆の方法を使用できます。

3

特に、範囲外のデータargvは変更しないでください。あなたのロジックは反対に動作するはずです:

char file[75]; 
    if (argc < 2) 
    { 
     cout << "Please enter the filename: "; 
     cin >> file; 
    } else 
     strcpy(file, argv[1]); 
    string content; 
    ifstream inFile(file); 

ていますが、より良いだけでなく、変数fileためstd::stringを使用しています。また

cin >>入力のみの単語(スペース記号を除く)が、あなたはstd::string

+0

それを修正しました!ありがとうございました!! – Ryu

関連する問題