Извлечение определенных целых чисел из строки C ++ - PullRequest
0 голосов
/ 07 октября 2018

Всем доброго времени суток,

Мне трудно пытаться извлечь целые числа из строки.Мне дается следующее чтение из файла:

itemnameitemnumber цена процента markup

примеры

  • Gowns-u2285 24,22 37%

  • TwoB1Ask1-m1275 90,4 1%

То, что я пытался сделать, это получить номер элемента, отделенный от имени элемента, чтобы я мог сохранить элементномер в качестве ссылки для сортировки.Как вы можете видеть в первом примере itemnameitemnumber представляет собой четкое разделение символа на цифру, тогда как в следующем примере в имени элемента есть числа.

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

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Добрый день,

Не знаю, есть ли у вас фиксированное количество цифр для itemnumber, но я собираюсь предположить, что вы этого не сделаете.

Этопростой подход;Сначала вы должны отделить слова вашей строки.Например, используйте std::istringstream.

Когда вы разбили строку на слова, например, передав ее итераторы к вектору или прочитав ее с помощью operator>>, вы начинаете проверять первое слово в обратном направлении.до тех пор, пока вы не найдете что-нибудь , то есть , а не один из "0123456789 " (обратите внимание на пробел в конце) .После того, как вы это сделаете, вы получите итератор о том, где заканчиваются эти цифры (назад), и обрежете исходную строку или, если у вас есть возможность, уже разбитую строку.Вуаля!У вас есть имя и номер элемента.

Для записи, я собираюсь сделать все это, используя ту же технику и для процентной разметки, конечно, за исключением символов "% ".

#define VALID_DIGITS "0123456789 "
#define VALID_PERCENTAGE "% "

struct ItemData {
    std::string Name;
    int Count;
    double Price;
    double PercentMarkup;
};

int ExtractItemData(std::string Line, ItemData & Output) {
    std::istringstream Stream( Line );

    std::vector<std::string> Words( Stream.begin(), Stream.end() );

    if (Words.size() < 3) {
        /* somebody gave us a malformed line with less than needed words */
        return -1;
    }

    // Search from backwards, until you do not find anything that is not digits (0-9) or a whitespace
    std::size_t StartOfDigits = Words[0].find_last_not_of( VALID_DIGITS );

    if (StartOfDigits == std::string::npos) {
        /* error; your item name is invalid */
        return -2;
    }
    else {
        // Separate the string into 2 parts
        Output.Name = Words[0].substr(0, StartOfDigits); // Get the first part
        Output.Count = std::stoi( Words[0].substr(StartOfDigits, Words[0].length() - StartOfDigits) );
        Output.Price = std::stod( Words[1] );

        // Search from backwards, until we do not find anything that is not '%' or ' '
        std::size_t StartOfPercent = Words[2].find_last_not_of(VALID_PERCENTAGE);
        Output.PercentMarkup = std::stod( Words[2].substr(0, StartOfPercent) );
    }

    return 0;
}

Запросы кода включают sstream, vector, string и cstdint, если вы не определили size_t

Надеемся на ответбыло полезно.Желаем удачи, COlda.

PS .: Мой первый ответ о переполнении стека ^^;

0 голосов
/ 07 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...