Разобрать строку, чтобы быть число или число и символ процента - PullRequest
0 голосов
/ 12 марта 2012

В C ++, лучше без библиотеки Boost, как убедиться, что std :: string str содержит либо число, либо число, за которым следует знак «%»? Если он не относится к этим двум случаям, должна быть выдана ошибка.

Ответы [ 4 ]

1 голос
/ 12 марта 2012
#include <iostream>
#include <string>
#include <algorithm>
#include <ctype.h>
bool is_a_bad_char(char c) {
  return !(isdigit(c) || (c=='%'));
}

int main() {
  std::string str = "123123%4141219";
  if (std::find_if(str.begin(), str.end(), is_a_bad_char) != str.end()) {
    std::cout << "error" << std::endl;
    return 1;
  }
  return 0;
}
1 голос
/ 12 марта 2012

Самое простое решение - это, вероятно, преобразовать строку (используя strtol или strtod, в зависимости от ожидаемого типа числа), а затем посмотреть на следующий символ.Что-то вроде:

(отредактировано для правильной обработки ошибок):

bool
isNumberOrPercent( std::string const& value )
{
    char const* end;
    errno = 0;
    strtod( value.c_str(), &end );
    return errno == 0 
        && (*end = '%' ? end + 1 : end) - value.c_str() == value.size();
}
0 голосов
/ 12 марта 2012

Не очень C ++ - иш, но что-то вроде этого сделало бы:

#include <cstdlib>
#include <cstring>

bool checkformat(const std::string &s) {
    const char *begin = s.c_str();
    char *end;
    double val = std::strtod(begin, &end);
    if (end == begin) return false;
    if (*end == '%') ++end;
    return (end - begin == s.size());
}

Имейте в виду, что strtod пропускает начальный пробел, поэтому, если вы не хотите принимать строку с начальным пробеломтогда вам нужно будет отдельно отказаться от этого.Он также принимает "NAN", "INF", "INFINITY" (все регистро-независимы), и каждой из этих вещей предшествует + или -, а в случае "NAN" необязательно следует некоторая определенная реализациейсимволы для обозначения , какое значение NaN оно представляет.Возможно, «INF» - это число, но по определению «NAN» - нет, поэтому вы хотите вернуть false, если val != val, и, возможно, также проверить бесконечность.

[Редактировать: я думаю, что 'Мы исправили проблемы, которые Джеймс поднял ниже, за исключением того, что " " и " %" все еще спорны.А потом он добавил переполнение в смесь.Между его ответом и моим вы должны понять - сначала решите, как вы хотите обработать каждый крайний случай, а затем закодируйте его.]

0 голосов
/ 12 марта 2012
  1. find_first_not_of со всеми цифрами и %
  2. Если приведенное выше возвращает npos, то проверьте, что последний символ равен %.
...