2016-10-07 3 views
-1

Я пытаюсь читать числа из строки, например. еслиЧтение целых чисел из строки без пробела

string str = "1Hi15This10"; 

Я хочу, чтобы получить (1,15,10)

Я попытался с помощью индекса, но я прочитал 10 как 1 и 0 не 10. я не мог использовать getline, потому что строка не является разделенных чем угодно.

Любые идеи?

+0

Это может помочь вам: http://stackoverflow.com/questions/17331250/read-all-integers -from-string-c –

+0

Вы знакомы с совпадением с помощью регулярного выражения? Вы можете использовать что-то вроде '/ (\ d +)/g', чтобы сопоставлять группы целых чисел в строке, а затем анализировать сами int в строках, возвращаемых как группы. – orphen

ответ

1

без регулярных выражений вы можете сделать это

std::string str = "1Hi15This10"; 
for (char *c = &str[0]; *c; ++c) 
    if (!std::isdigit(*c) && *c != '-' && *c != '+') *c = ' '; 

целые теперь отделено космическим разделителем, который тривиальна для разбора

+0

Может также использовать '! Std :: isdigit (* c)', который также будет работать с не-буквами. Также может потребоваться адаптировать подход, чтобы допускать наличие знаковых символов ('+' или '-'). – Peter

+0

Это потенциально вызывает Undefined Behavior. [Подробности] (https://stackoverflow.com/questions/21805674/do-i-need-to-cast-to-unsigned-char-before-calling-toupper) –

0

ИМХО лучше всего было бы использовать регулярное выражение.

#include <iostream> 
#include <iterator> 
#include <string> 
#include <regex> 

int main() { 
    std::string s = "1Hi15This10"; 

    std::regex number("(\\d+)"); // -- match any group of one or more digits 

    auto begin = std::sregex_iterator(s.begin(), s.end(), number); 

    // iterate over all valid matches 
    for (auto i = begin; i != std::sregex_iterator(); ++i) { 
     std::cout << " " << i->str() << '\n'; 
     // and additional processing, e.g. parse to int using std::stoi() etc. 
    } 
} 

Выход:

1 
    15 
    10 

Live example here on ideone.

Да, вы могли бы просто написать свой собственный цикл для этого, но:

  1. вы, вероятно, сделать какие-то глупые ошибки где-то,
  2. Регулярное выражение может быть ada для обслуживания множества различных шаблонов поиска; например что, если tmr вы решите, что хотите поддерживать десятичные/отрицательные числа с плавающей запятой; эти случаи и многие другие будут легко поддерживаться с помощью регулярного выражения, возможно, не столько с вашим пользовательским решением :)
Смежные вопросы