Как я могу разобрать double из строки?

#c

#c

Вопрос:

У меня есть следующий код, но он преобразует только строки в double. если строка содержит букву, это вызывает ошибку

  while (cin >> s){
        const char *c_ptr=s.c_str();
        d = atof(c_ptr);
        v.push_back(d);
    }
  

Я хочу ввести строку типа «a1.2 3 4b» и заполнить вектор «1.2 3 4»

Комментарии:

1. cplusplus.com/reference/clibrary/cstdio/sscanf

2. sscanf будет работать, только если вы заранее знаете, сколько удвоений вы читаете, а также какие нечисловые символы содержит строка.

3. Что, если входные данные «4a1.2»? Сколько чисел должно входить в вектор? Если только один, каким должно быть его значение?

4. Вы должны либо точно определить свой ввод в соответствии с типами c , т.е. char double space int int, либо вам придется использовать регулярное выражение

5. Это ложная дихотомия, @Adrian.

Ответ №1:

Как насчет этого:

 1) replace all chars in the string that aren't digits or decimal points by spaces
2) read doubles in a loop
  

поскольку вы избавились от букв перед разбором двойников, они больше не должны вызывать проблем.

Комментарии:

1. звучит как хорошая идея. как вы используете функцию replace для замены этих символов? я не могу заставить str.replace() работать на c

2. PS вы, вероятно, захотите использовать istringstream для шага 2, поскольку ваш приведенный выше код получит только один double из каждой строки. Смотрите daniweb.com/software-development/cpp/threads/54367 для примера.

3. Самый простой способ, который я могу придумать, это просто выполнить замену самостоятельно в цикле for . Аналогичный пример можно увидеть здесь daniweb.com/software-development/cpp/threads/349806