2016-07-27 105 views
-6

我想通過使用stoi將字符串轉換爲int,但由於某種原因它給了我一個錯誤並給我這個消息:與stoi有關的奇怪錯誤?

「libC++ abi.dylib:以未捕獲的類型異常std :: invalid_argument:stoi:no conversion「

處理stoi的行以粗體顯示,朝向代碼的底部。

這裏是我的代碼:

#include "LongDistanceCalls.h" 
#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 


string line; 
string temp = ""; 
string beginning_time; 

void convertTimeintoInt(string beginning_time) 
{ 
    for(char a : beginning_time) 
    { 
    if(a == ':') 
      continue; 
    else 
     temp += a; 
    } 
} 

int main() 
{ 
    ifstream inFile; 
    string day; 
    int minutes; 
    double total_callpay; 
    //opens .txt file 
    inFile.open("CallRecords.txt"); 

    //if .txt file is openable, printed to command line. 
    if (inFile.is_open()) 
    { 
    cout<<"Day Time Duration Cost"<<endl; 

    while(getline(inFile,line)) 
    { 
     istringstream split(line);//splits each string into 3 seperate strings (day, beginning_time, minutes) 

     while(split) 
      { 
       split >> day; 
       split >> beginning_time; 
       split >> minutes; 
       **int time = stoi(temp);** 
       time = time > 0 && time < 2400; 
+7

'temp'只是一個空字符串,你似乎沒有在程序中的其他任何地方設置它。 – ArchbishopOfBanterbury

+0

從[documentation](http://en.cppreference.com/w/cpp/string/basic_string/stol):異常 std :: invalid_argument如果不能執行轉換 std :: out_of_range如果轉換後的值會不在結果類型的範圍內,或者如果基礎函數(std :: strtol或std :: strtoll)將errno設置爲ERANGE。 – AndyG

+1

您的全局變量'temp'不會在'main'中的任何地方更新,也不會在'main'中調用任何函數。使用調試器可以讓你看到崩潰時'temp'中的值。 – crashmstr

回答

0

string temp = "";

int main() 
{ 
    ... 
    int time = stoi(temp); 
    ... 
} 

你在哪裏改變溫度值。 stoi錯誤,因爲輸入值是一個空字符串。 See here在底部的例外條目下。

0

首先在此代碼:

string beginning_time; 

void convertTimeintoInt(string beginning_time) 
{ 
    for(char a : beginning_time) 
    { 
     if(a == ':') 
      continue; 
     else 
      temp += a; 
    } 
} 

你有全局變量beginning_time以及具有相同名稱的說法。所以裏面的函數使用局部變量,而不是全局變量。這是建議儘可能避免全球變數的原因之一。

其次你只定義了功能convertTimeintoInt但你實際上沒有調用它,所以它什麼都不做。相反,你應該避免使用全局變量,讓你的功能是這樣的:

int convertTimeintoInt(string beginning_time) 
{ 
    string temp; 
    for(char a : beginning_time) 
    { 
     if(a == ':') 
      continue; 
     else 
      temp += a; 
    } 
    return std::stoi(temp); 
} 

然後調用它裏面main()

split >> beginning_time; 
    split >> minutes; 
    int time = convertTimeintoInt(beginning_time); 

注:我所做的僅僅是複製你的函數實現假定它有正確的行爲您。