2015-11-08 4 views
2

Я пытаюсь разобрать строку в целое число, и я не совсем уверен, что я делаю неправильно:Не удалось разрешить идентификатор стои

string input; 
cin >> input; 
int s = std::stoi(input); 

Это не будет строить и поднимает ошибку: ' stoi 'не является членом' std '.

+1

Попробуйте добавить точку с запятой в конце инструкции 'cin'. –

+0

Я сделал это, и теперь он говорит, что «stoi» не является членом «std». – Neil

+2

Тогда вам нужно будет указать и обязательно скажите компилятору использовать C++ 11 (я считаю, что все версии gcc до 5.0 этого требуют). –

ответ

2

Старая версия компилятора C++ не поддерживает stoi. для более старой версии вы можете использовать следующий фрагмент кода для преобразования строки в целое.

#include <iostream> 
#include <string> 
#include <cstdlib> 
using namespace std; 

int main() { 
    string input; 
    cin >> input; 
    int s = std::atoi(input.c_str()); 
    cout<<s<<endl; 
    return 0; 
} 

В противном случае используйте версию компилятора C++ выше C++ 11.

0

Вы должны использовать std::stringstream. Утилиты строки C являются плохими для std::string.

#include <iostream> 
#include <string> 
#include <sstream> 

int main() { 
    int num1, num2; 
    std::string line("5 6"); 
    std::stringstream ss(line); 
    ss >> num1 >> num2; 
    std::cout << "num1 is " << num1 << " and num2 is " << num2 << std::endl; 
    return 0; 
} 

Вот ideone.

0

Возможно, вы забыли включить строку.

Кроме того, имейте в виду, что стои может бросить, так что вы хотите, чтобы инкапсулировать его использование в Try/поймать блок, например, так:

using namespace std; 
try 
{ 
    string stringy= "25"; 
    int x= stoi(string); 
    cout<<"y is: "<<y<<endl; 
} 
catch(invalid_argument& e) 
{ 
    cout<<"you entered something that does NOT evaluate to an int"<<endl; 
} 

Попробуйте это, если вы предоставляете стои скажем, «x25», он бросит, если не пройдет. Если вы не используете этот синтаксис try/catch, программа вырвет момент stoi throws.

Кроме того, кажется, что stoi достаточно умен, чтобы остановить синтаксический анализ, если он обнаруживает то, что не оценивает, поэтому «25x» будет работать нормально, он просто опустит x. Но «x25» бросит.

Хотя обработка исключений не была непосредственно частью вашего вопроса, мне показалось разумным упомянуть.

Смежные вопросы