2016-06-29 9 views
-1

配列内の繰り返し文字列を検索する必要がありますが、セグメンテーションフォルトがコアダンプされているだけのエラーはありません。
カウントが更新されていないため、出力が得られません。セグメンテーションフォールトコアダンプC++の繰り返し配列検索

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <string.h> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    int n, q; 
    cin >> n; 
    cin >> q; 
    string a[n], b[q]; 
    int i, j, count = 0; 
    for (i = 0; i < n; i++) 
     cin >> a[i]; 
    for (i = 0; i < q; i++) 
     cin >> b[i]; 
    for (i = 0; i < q; i++) { 
     string k; 
     k = b[i]; 
     for (j = 0; j < n; j++) { 
      if (b[i] == a[j]) 
       count++; 
     } 
     cout << count << "\n"; 
     count = 0; 
    } 

    return 0; 
} 

ですので、この問題を解決するのに手伝ってください。ありがとうございます。

+3

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+3

また 'string a [n]、b [q]; 'は標準ではなく、標準準拠のコンパイラではコンパイルされません。 – NathanOliver

+1

可変長配列を使用しました。あなたのプログラムをクラッシュさせるのは、貧しいプログラムがスタック上に例えば10,000,000,000の 'int'sのためのスペースを割り当てようとすると、1人の大規模なユーザーの入力だけです。 – user4581301

答えて

0
int n, q; 
cin >> n; 
cin >> q; 
string a[n], b[q]; 

上記のコードでは、variable length arrays (VLA)が使用されています。これらは最近のCでは有効ですが、C++では有効ではありませんfor a number of reasons。 OPがちょうど1つに遭遇した可能性があります。

これはVLAを完全に拒否するため、多くのコンパイラでは問題にはなりませんが、VLAを非標準拡張として許可しているコンパイラは、自動ストレージの動的記憶域(おそらくヒープ)に配列を割り当てる義務はありません(おそらくスタック)、または意味を成す場所であればどこでもかまいません。文字通り、実装者が作成したものを除いて、標準への拡張の規則はありません。 GCCのdocuments on VLA supportを通じて読む

はそれがが自動変数のようにに扱われると言っ以外の任意のヒントを与えるものではありませんが、かわいいハックは劇中で何ができるかについては何も(std::unique_ptrを隠し自動のような動的割り当ての振る舞いをしないために、 例えば)。実験では、GCCがVLAをスタックに格納し、いくつかのスタックオーバーフローに関する質問と回答が同意していますが、これはドキュメントの行を変更したり、GCCとそのユーザー間の契約を破棄することなくいつでも変更できます。言い換えれば、次回にコンパイラを更新したときに利用されている動作を考慮しないでください。

とにかく、正常性のためにのみ非標準的な動作を避けるべきです。上記のコードは

int n, q; 
cin >> n; 
cin >> q; 
vector<string> a(n), b(q); 

と同じように機能すること、標準に準拠し、安全、およびstd::stringデフォルトコンストラクタがstd::vectorを持つすべての要素や配列のために呼ばれようとしているので、ノー遅く書き換えることができます。

この変更を行った後、私のPCがダイナミックストレージを割り当てる能力を超えるベクトルサイズを指定せずにセグメンテーションを生成することはできません。

+0

私はベクトルに文字列を変更しましたが、出力は表示されません。これはコンパイラがforループを入力していないためです。出力は印刷されるべきです –

+0

@SrikantaRaju有効な入力が与えられた場合、私はあなたの新しい問題を再現することができません。開発環境に付属のデバッガを使用してコードを実行することをお勧めします。開発環境にデバッガがない場合は、選択した開発環境を再考してください。まだ立ち往生している場合は、新しいコードに基づいて新しい質問をしてください。 – user4581301

+0

実際、私はHackerrankでこれを解決していますので、デバッガを持っていないのです...私はデバッガを持っているコンパイラをお勧めしますか? –

関連する問題