2016-09-30 11 views
0

を使用してintに文字列から変換できません私はrosterListと呼ばれる文字列のベクトルにファイルを読み込む:は、最初に私のプログラムではSTOI

100

95

0

-1

110

80

90

-1

120

80

75

-1

130

60

55

-1

この手順が成功しました。私の目標は、上記のデータを使用してStudentオブジェクトのベクトルを作成することです。動的次いで、それを行うに

Student::Student(string id,string g1,string g2) 

線が整数に変換した場合、プログラムは、線によって列線のこのベクトルをループ大きいか又は100に等しく、それはIDである:コンストラクタは、パラメータとして3つの文字列を受け付けID(現在の行)とをパラメータとして、次の2行を渡すことによって、新しいStudentオブジェクトを作成し、そしてベクターstudentRecords

for (vector<string>::iterator it = rosterList.begin(); it<rosterList.end();it++){ 
     if(stoi(*it)>=100 || it == rosterList.begin()){ // error 
      studentRecords.push_back(
       Student(*it,*(it+1),*(it+2)) // dynamically push 
      ); 
     } 
    } 

にオブジェクトを追加し、動的エラーがある:

libc++abi.dylib: terminating with uncaught exception of type std::invalid_argument: stoi: no conversion

私はそれをオンラインで見て、エラーはstoiから変換できません。プログラムのどこが間違っていますか?

+3

空行も読んでいて、それを 'stoi'に与えているのでしょうか? – pzelasko

+2

開発とデバッグでは、常にすべての入力をエコーする必要があります。私はあなたのcin文に問題があると推測します(あなたが提示していないコードです)。 [MCVE]を見直して、私たちが見ることのできるいくつかの最小限のコードを表示するか、少なくともそれが動作すると思う理由を説明してください。あなたは名簿をダンプできますか? –

+1

"プログラムのどこが間違っていますか?"これは、デバッガの使い方を学ぶのに最適なタイミングです。 – kfsone

答えて

0

ファイルを正しく読み取る必要があります....または ファイルデータが確実でない場合は、数値コンテンツの検証を行います。 以下はコードサンプルです。 ファイル内の数値コンテンツ以外の迷惑メールは、エラーの原因となります。 コードを以下のようにコンパイルしてください。あなたはそれを最適化することができます。私はあなたのコードで表示さ

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

    using namespace std; 

std::vector<string> rosterList; 
bool is_numeric(string strin) 
{ 
    char const *str = strin.c_str(); 
    return all_of(str, str+strlen(str), 
         [](unsigned char c) { return ::isdigit(c); }); 
} 

int main(int argc, char *argv[]) 
{ 
    rosterList.push_back("100"); 
    rosterList.push_back(" "); 
    rosterList.push_back("140"); 
    rosterList.push_back("180"); 


for (vector<string>::iterator it = rosterList.begin(); it<rosterList.end();it++){ 
     if(is_numeric(*it) && (stoi(*it)>=100 || it == rosterList.begin())){ // error 

     std::cout<<stoi(*it)<<std::endl; 
     } 
    } 
} 
+0

私はあなたの答えを見る前に@pzelaskoのコメントを見て、 'is_numeric'に似た何かが私のプログラムに追加したものです。ありがとうございます –

0

一つの問題は、itは、ベクトルの最後の2つの位置のときにもit+1it+2にアクセスしているということです。これは、rosterList.end()の後にこれが指すように存在しないポインタにアクセスしようとします。

it+1it+2<,rosterList.end()の場合は、使用する前にテストする必要があります。

+0

幸いにも彼のコードでは "-1"最後の要素ですのでif文は失敗します。しかし、55(最後の1つ)... *(それ+1)が "-1"で(* it + 2)が終わりを尊重しようとしているとき(...)逆参照 "end()"。私はそれを試みたことはありません。 – Naidu

関連する問題