Как определить, что вся строка не была проанализирована с помощью c ++ - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь разобрать строку, чтобы определить, является ли она числом или именем, и т. Д. И для этого я выкладываю примеры типа «10 мсек»: он анализирует только 10, не возвращая ошибку. Что я хочу сделать, так это получить, может ли быть проанализирована вся строка, а не только ее часть.

Вот мой код:

string s = "10 ms";
bool number = true;
try {
   stof(s, nullptr);
} catch (invalid_argument){
   number = false;
}

Возвращает это число. И возвращаемое число от stof равно 10. Я также пытался использовать catch (...), та же проблема.

1 Ответ

3 голосов
/ 22 июня 2019

Глядя на документацию std :: stof , он имеет 2 аргумента, один из которых является выходным аргументом.

Это можно использовать следующим образом:

#include <string>
#include <iostream>

int main(int, char**)
{
    try
    {
        std::string s = "10 ms";
        bool number = true;
        std::size_t nofProcessedChar = 0;
        auto nr = std::stof(s, &nofProcessedChar);
        std::cout << "found " << nr << " with processed " << nofProcessedChar << std::endl;
        auto allCharsProcessed = nofProcessedChar == s.size();
        std::cout << "all processed: " << allCharsProcessed << std::endl;
    }
    catch(const std::invalid_argument &)
    {
        std::cout << "Invalid argument " << std::endl;
    }
    catch (const std::out_of_range &)
    {
        std::cout << "Out of range" << std::endl;        
    }
}

Код в проводнике компилятора

Как видно на выходе

found 10 with processed 2
all processed: 0

Печатает 0 для всех обработанных, что является числовым значением приведения bool.

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