2016-07-27 13 views
-6

Ich versuche, eine Zeichenfolge in einen int zu konvertieren, indem stoi verwenden, aber aus irgendeinem Grunde ist es mir einen Fehler geben und mir diese Botschaft geben:Sonderbarer Fehler im Zusammenhang mit stoi?

„libC++ abi.dylib: mit abgefangene Ausnahme des Typs beendet std :: invalid_argument: stoi: keine Konvertierung "

Die Zeile, die sich mit stoi beschäftigt, ist am unteren Rand des Codes fett geschrieben.

Hier ist mein Code:

#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' ist nur ein leerer String, Sie scheinen ihn nirgendwo anders im Programm einzustellen. – ArchbishopOfBanterbury

+0

Aus der [Dokumentation] (http://en.cppreference.com/w/cpp/string/basic_string/stol): Ausnahmen Std :: Invalid_argument Wenn keine Konvertierung durchgeführt werden konnte Std :: Out_of_range, wenn der konvertierte Wert würde fallen außerhalb des Bereichs des Ergebnistyps oder wenn die zugrunde liegende Funktion (Std :: Strtol oder Std :: Strtoll) Errno auf ERANGE setzt. – AndyG

+1

Ihre globale Variable 'temp' wird nirgendwo in' main' oder durch irgendeine in 'main' aufgerufene Funktion aktualisiert. Wenn Sie einen Debugger verwenden, können Sie sehen, welcher Wert zum Zeitpunkt des Absturzes in 'temp' war. – crashmstr

Antwort

0

string temp = "";

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

Wo Sie den Wert der Temperatur ändern sich. stoi ist fehlerhaft, da der Eingabewert eine leere Zeichenfolge ist. See here unter dem Eintrag Ausnahmen unten.

0

Zuerst in diesem Code:

string beginning_time; 

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

haben Sie globalen Variable beginning_time sowie Argument mit dem gleichen Namen. Also innerhalb der Funktion verwenden Sie lokale Variable, nicht globale. Dies ist einer der Gründe, warum es empfohlen wird, globale Variablen so weit wie möglich zu vermeiden.

Zweitens, Sie definieren nur die Funktion convertTimeintoInt, aber Sie rufen es nicht wirklich an, also tut es nichts. Stattdessen sollten Sie globalen Variablen verwenden vermeiden und Ihre Funktion wie folgt machen:

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

und dann rufen innen main():

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

Hinweis: Ich habe gerade Kopie Ihrer Funktion Implementierung vorausgesetzt, es ist das richtige Verhalten hat für Sie.

Verwandte Themen