2016-10-17 7 views
-1

ユーザー入力の文字列でプログラムを実行し、関数を呼び出すたびに、入力した内容に関係なくセグメント化エラーが発生します。私はかなり経験がなく、どんなインプットも高く評価されています。私のプログラムがクラッシュする文字列を入力しようとするたびに、問題は私のentry()関数にあります。毎回同じ場所でセグメント違反が表示される理由を知りたいと思います。私は明白な何かを欠いていますかベクトルの押し戻しによるセグメンテーションフォールト

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <vector> 
#include <algorithm> 

class Interface 
{ 
private: 
    std::vector<std::string> storage; 
    std::vector<bool> flag; 
int i; 
std::string temp; 
//temp 
int t; 
public: 
void entry(); 
void display(); 
void remove(); 
void complete(); 
void exit(); 
void recursiveBonus(); 

}; 

void Interface::entry() 
{ 
i = 0; 
do 
{ 
    std::cout << "Please enter a task:" << std::endl; 
    getline(std::cin, temp); 
    storage.push_back(temp); 
    flag.push_back(false); 
    i++; 
}while(storage[i] != " "); 
}; 
+2

'std :: vector ストレージ(" ");'私のためにコンパイルされません – krzaq

+0

申し訳ありません!私は、初期化の助けになるかもしれないと思っていましたが、これを削除して、ここに掲載されたコードに修正しました。まだ実行中の欠陥を取得します。 –

+0

あなたはロジックに少しの欠陥があるようです。私は空の文字列が入力されたときにループを終了したいと思いますか?次に、それを確認する必要があります。私。 'if(temp.empty()){ブレーク; } ' –

答えて

0

entry()に入るときstorageが空であると仮定すると:

は、第1のループの反復を考えます。最初にi == 0と入力した場合は、push_backという文字列をstorageに読み込みます。その後、インクリメントi。今すぐi == 1。 次に、storage[i]、すなわちstorage[1]にアクセスするループ条件がチェックされます。インデックス1はベクトルの2番目の要素を表しますが、挿入したのは1つだけです。 このため、ここで未定義の動作が発生している可能性があります。

最後に入力したものが空であることを確認する場合は、""" "ではなく)に対してテストする必要があります。後者は空文字列ではなく、1つの空白文字列を持ちます。他のアドバイスについては、質問のコメントを参照してください。

+0

お二人ともお役に立ちました、ありがとうございました!私はちょうど私が再訪する必要があることについて散らばって論理的なエラーがあるように思えます。 –

関連する問題