C ++ Разобрать строку в целое с конкретными классами - PullRequest
2 голосов
/ 15 сентября 2011

Это может звучать глупо, но мне было просто интересно, как я могу разобрать строку с целым числом в C ++?

Это для школьного проекта, а в пояснительной записке написано: "Толькоиспользование классов iostream и string и функции system() разрешено; использование любого другого класса или функции запрещено. "

Я немного обыскал, но единственные предложенияЯ обнаружил, что используют классы типа atoi или atof.

Входная строка уже проверена на наличие ошибок перед синтаксическим анализом, поэтому она всегда будет содержать только целое число.

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

Спасибо большое, если вы можете помочь.

Ответы [ 5 ]

40 голосов
/ 16 сентября 2011

Итак, вы можете использовать system(), а? Вот этот шедевр машиностроения:

#include <fstream>

void download_boost() {
    system("wget http://downloads.sourceforge.net/"
           "project/boost/boost/1.47.0/boost_1_47_0.tar.bz2"
           "?r=http%3A%2F%2Fwww.boost.org%2Fusers%2Fhistory%2F"
           "version_1_47_0.html&ts=1316116936&use_mirror=kent"
           " -O boost_1_47_0.tar.bz2");
}

void unpack_boost() {
    system("tar --bzip2 -xf boost_1_47_0.tar.bz2");
}

void write_program() {
    std::ofstream os("blah.cpp");
    os << "#include \"boost/lexical_cast.hpp\"\n"
          "#include <iostream>\n"
          "#include <string>\n"
          "int main() { std::string s; std::cin >> s;"
          "int i = boost::lexical_cast<int>(s);"
          "std::cout << i; }";
}

void compile_program() {
    system("g++ -Iboost_1_47_0 blah.cpp");
}

void run_program() {
    system("./a.out");
}

int main() {
    download_boost();
    unpack_boost();
    write_program();
    compile_program();
    run_program();
}

(я предполагаю типичную установку Linux с некоторыми установленными инструментами.)

2 голосов
/ 15 сентября 2011
#include <iostream>
#include <string>

int stringToInt(const std::string &text)
{
    int number = 0;

    int powerIndex = 1;

    for (int i = text.length() - 1; i >= 0; i--)
    {
        number += powerIndex * (text.at(i) - '0');

        powerIndex *= 10;
    }

    return number;
}

std::string intToString (int number)
{
    std::string text = "";

    int numberHolder = number;

    while (numberHolder)
    {
        char digit = (numberHolder % 10) + '0';

        text = digit + text;

        numberHolder /= 10;
    }

    return text;

}
int main ()
{
    //Testing...

    int number = stringToInt("123");

    std::string text = intToString(456);

    std::cout << number << "\n" << text << "\n";

    return 0;
}
2 голосов
/ 15 сентября 2011

stringstream ближе всего подходит к тому, что вы хотите сделать, хотя поначалу это может показаться немного громоздким.

Пример:

#include <string>
#include <sstream>

// (...)
std::string str = "12345";
std::istringstream ss(str);
int num;
ss >> num;

Как функция (и оптимизировано):

#include <sstream>
#include <string>

int stringToInt(const std::string &str) {
    static std::istringstream ss;
    ss.clear();
    ss.str(str);

    int num;
    ss >> num;

    return num;
}

Здесь я повторно использую std::istringstream, применяя ключевое слово static.Я создал очень простой тест, который демонстрирует, что это примерно в 2 раза быстрее, чем не повторное использование: http://pastebin.com/vLSmCyMF

Предупреждение относительно безопасности потока: Как и рытфолдкак отмечается в комментариях, приведенная выше реализация stringToInt не является поточно-ориентированной.Если вы хотите безопасно вызывать эту функцию из нескольких потоков, вам следует использовать спецификатор класса хранения thread_local (доступен с C ++ 11).

1 голос
/ 15 сентября 2011

В основном, учитывая std::string mystring, который содержит только целое число: Начните с int result = 0;.
В то время как mystring имеет цифры
Умножьте результат на десять
Добавить самую большую цифру (первая в строке)
Помните, что символ «0» не имеет значения 0.
Удалить самую большую цифру из строки

Итак:
Если у меня есть строка «1543», результат = 0
умножаем результат на десять: результат = 0
добавляем первую цифру: результат = 1
удалить первую цифру из строки "543"
умножаем результат на десять: результат = 10
добавляем первую цифру: результат = 15
удалить первую цифру из строки "43"
умножим результат на десять: результат = 150
добавляем первую цифру: результат = 154
удалить первую цифру из строки "3"
умножаем результат на десять: результат = 1540
добавляем первую цифру: результат = 1543
удалить первую цифру из строки ""
Строка пуста, поэтому мы закончили

Я написал код, но потом вспомнил, что это была домашняя задача.

1 голос
/ 15 сентября 2011
std::string mystring = "12";

std::ostringstream str(mystring);
int someint;
str >> someint;
...