Как преобразовать строку C++ в int?

Possible Duplicate:
How to parse a string to an int in C++?

Как преобразовать строку C++ в int?

Предположим, вы ожидаете, что строка будет содержать реальные числа (например, «1», «345», «38944»).

Кроме того, предположим, что у вас нет boost, и вы действительно хотите сделать это способом C++, а не старым хитрым способом C.

Как насчет некоторых примеров из следующего: codeproject.com/KB/recipes/Tokenizer.aspx Они очень эффективны и несколько элегантны.

Matthieu N. 04.11.2010 04:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
46
1
136 495
8

Ответы 8

Используйте потоки C++.

std::string       plop("123");
std::stringstream str(plop);
int x;

str >> x;

/* Lets not forget to error checking */
if (!str)
{
     // The conversion failed.
     // Need to do something here.
     // Maybe throw an exception
}

PS. Этот основной принцип - как работает библиотека повышения lexical_cast<>.

Мой любимый метод - буст lexical_cast<>.

#include <boost/lexical_cast.hpp>

int x = boost::lexical_cast<int>("123");

Он предоставляет метод преобразования между строковым и числовым форматами и обратно. Под ним используется строковый поток, поэтому все, что может быть маршалировано в поток, а затем де-маршалировано из потока (взгляните на операторы >> и <<).

разве это не должно быть "если (! x) ..."?

Svante 20.11.2008 06:31

Нет. Если оператору потока не удается извлечь число из str, он устанавливает плохой бит. Использование этого в логическом контексте (как указано выше) будет проверять, в порядке ли поток, возвращая объект, который можно преобразовать в bool. Если бы я проверил «x», то он потерпел бы неудачу, если значение, помещенное в «x», равно 0. Если поток не смог извлечь что-либо, значение «x» не определено.

Martin York 17.04.2009 22:43

Он устанавливает бит провал, а не бит плохой. оператор! является синонимом функции fail ().

scai 01.08.2012 18:19

Используйте атой

Не особо C++, не так ли? Даже std :: atoi на самом деле не C++ ...

graham.reeds 26.10.2008 00:08

atoi () выполняет другую магию ... например, игнорирует начальные пробелы, игнорирует конечные непробельные символы и предполагает, что "0" также является допустимым условием ошибки. Пожалуйста, используйте atoi () только тогда, когда вас действительно не заботит валидность. В противном случае strtod () в C и std :: istringstream в C++.

Tom Barta 20.11.2008 06:18

#include <sstream>

// st is input string
int result;
stringstream(st) >> result;

Что делать, если произошла ошибка? Скажем, в строке нет числа («привет!» Вместо «5»).

krupan 14.10.2008 22:05

Затем вы проверяете наличие ошибки: (stringstream (st) >> result)? cout << result: cerr << "Вы проиграли";

Robᵩ 14.10.2008 23:50

в "stdapi.h"

StrToInt

Эта функция сообщает вам результат и количество символов, участвовавших в преобразовании.

Хм? Поиск в Google для этого "stdapi.h" ничего не дает. Вы имеете в виду "shlwapi.h" (который относится к Windows, является частью DLL оболочки и эквивалентен старым хитрым способам на языке Си)?

bk1e 14.10.2008 09:57

Раньше я использовал что-то вроде следующего в коде C++:

#include <sstream>
int main()
{
    char* str = "1234";
    std::stringstream s_str( str );
    int i;
    s_str >> i;
}

В ПОРЯДКЕ. Кто-то уже предлагал это, поэтому я повысил их.

ayaz 14.10.2008 09:49

Возможно, я неправильно понимаю вопрос, почему именно нет захочет использовать атой? Не вижу смысла изобретать велосипед.

Я просто упустил суть?

На странице руководства для atoi () говорится: «Функция atoi () входит в состав strtol (), но сохраняется, поскольку она широко используется в существующем коде. Если число неизвестно, находится в диапазоне, следует использовать strtol (). потому что atoi () не требуется для проверки ошибок ".

krupan 14.10.2008 21:50

Я думал, что atoi () был нестандартным, поэтому доступен не везде. Хотя может ошибаться.

Martin York 14.10.2008 22:41

Отличный момент, Крупан. Признаюсь, я не думал об этом.

user12576 15.10.2008 15:39

atoi () также игнорирует начальные пробелы и завершающую хрень, поэтому она может быть успешной там, где другие более строгие парсеры потерпят неудачу. В зависимости от вашей точки зрения это может быть преимуществом или препятствием.

Tom Barta 20.11.2008 06:19

C++ FAQ Lite

[39.2] Как преобразовать std :: string в число?

https://isocpp.org/wiki/faq/misc-technical-issues#convert-string-to-num

лучший подход, imho, особенно с настраиваемым fail_on_leftover

Eli Bendersky 08.05.2010 12:49

Что такое "fail_on_leftover"?

Alessandro Jacopson 24.06.2010 22:36

Разрешите добавить свой голос за boost :: lexical_cast

#include <boost/lexical_cast.hpp>

int val = boost::lexical_cast<int>(strval) ;

Он выдает bad_lexical_cast при ошибке.

Другие вопросы по теме