C ++ Ошибка при преобразовании int в строку

0

Когда я пытаюсь преобразовать int в строку, он создает странные результаты, о которых я не знаю, откуда они взяты, здесь фрагмент кода:

if (!ss.fail() && !ss.eof()) {
    ss.clear();

    string operand1 = "" + num1;
    string operand2 = "";
    getline(ss,operand2);   
    operand2 = trim(operand2);

    cout << num1 << endl << operand1 << endl;
    return expression_isvalid(operand1) && expression_isvalid(operand2) && operator_isvalid(c);

}

ss - строковый поток, num1 - это int, а c - символ.

в основном вход представляет собой выражение типа "1 + 1", num1 содержит первый int, который он находит в этом выражении (используя ss >> num1)

я не понимаю, что эта часть

string operand1 = "" + num1; // assume input is "1 + 1" so num1 contains the value 1
...
cout << num1 << endl << operand1 << endl; 

выходы

1
exit

Я понятия не имею, откуда происходит "выход", слово изменяется в зависимости от ввода, "exit" становится "it", когда я вводил "3 + 1" и "ye", когда я вводил "13 + 2".

  • 1
    пробелм с написанием пробелм в заголовке? :)
  • 1
    Ага. И проблема с переполнением буферов и прочее. (Кажется, эта случайная строка пришла из недействительной памяти -> UB.)
Показать ещё 4 комментария
Теги:
string
output

2 ответа

0

Я предлагаю вам использовать функцию strtoul std. Здесь вы можете найти хорошую документацию.

Примером может служить:

static unsigned long stringToInt(const string& str) {
  const char* cstr = str.c_str();
  char* endPtr = 0;
  return ::strtoul(cstr, &endPtr, 0);
}
  • 2
    или вы могли бы предложить что-то более похожее на C ++ и полностью избежать strtoul.
0

Вы можете использовать stringstream для преобразования различных типов в string. Для этого я обычно использую следующий шаблон:

template <typename T>
static std::string strfrom(T x)
{
    std::ostringstream stream;

    stream << x;

    return stream.str();
}

Затем, чтобы преобразовать int i в string i_str, просто выполните:

i_str = strfrom<int>(i)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню