Как извлечь цифру (ы) из конца строки - PullRequest
7 голосов
/ 01 ноября 2010

Имеются следующие строки:

   sdfsd34 
    sdfdsf1

Я хотел бы извлечь: 34, 1 с использованием c ++ (STL, но без повышения), c.

спасибо

Ответы [ 7 ]

25 голосов
/ 01 ноября 2010

Вы ищете функцию string.find_last_not_of:

string str = "sdfsd34";
size_t last_index = str.find_last_not_of("0123456789");
string result = str.substr(last_index + 1);
4 голосов
/ 01 ноября 2010

Здесь многое зависит от того, удобнее ли вам манипулировать строками или использовать итераторы в стиле STL и тому подобное. Как уже отмечал @Konrad, std::string имеет встроенный find_last_not_of для всех, кто любит манипуляции в стиле строки.

Если вы предпочитаете, вы можете работать со строкой, немного более похожей на контейнер, и найти первую не цифру, начиная с конца:

std::string::iterator pos = std::find_if(
    mystring.rbegin(), 
    mystring.rend(), 
    std::not1(std::isdigit)).base();

В этом случае преобразование из reverse_iterator в iterator происходит очень хорошо. reverse_iterator, возвращаемый find_if, будет ссылаться на последний элемент перед непрерывным набором цифр в конце строки. Однако base этого относится к первой из цифр (или mystring.end(), если в конце нет цифр, или (к сожалению), если вся строка состоит из цифр).

2 голосов
/ 02 ноября 2010

Вот решение CВы должны включить stdio.h и ctype.h, чтобы заставить это работать.

char* str = "djafldjsalj124"; 
long n; 

char *s = str; 
while (*s && !isdigit(*s)) s++; 
if (*s)
{
 sscanf(s, "%d", &n);  
 printf("%d\n", n); 
}
2 голосов
/ 01 ноября 2010

Начальная версия, с использованием <algorithm>:

string input("aasdf43");
string matches("01234567890");

string::iterator iter = find_first_of(input.begin(), input.end(), 
        matches.begin(), matches.end());

string next(iter, input.end());

stringstream intStream(next);
int intValue;
intStream >> intValue;

РЕДАКТИРОВАТЬ: Лучше использовать функцию-член:

string input("aasdf43");
string matches("0123456789");
size_t offset = input.find_first_of(matches);
string next(input.substr(offset));

stringstream intStream(next);
int intValue;
intStream >> intValue;

Только для примера - версия <algorithm>, не требующая проверкипротив всех цифр.

string::reverse_iterator iter = find_if_not(input.rbegin(), input.rend(), 
    ([&](char c) { return c >= '0' && c <= '9';}));
reverse(input.rbegin(), iter);
string reversed(input.rbegin(), iter);

stringstream intStream(reversed);
int intValue;
intStream >> intValue;
1 голос
/ 01 ноября 2010

Если они всегда в конце, то просто начните с конца строки и найдите цифру, когда вы доберетесь до первого нецифрового числа, тогда оно у вас есть. Посмотрите на reverse_find, или find_reverse, или что-то в этом роде. Прошло много времени с тех пор, как я выполнял какие-либо манипуляции со строками в STL. Будучи старомодным программистом на C, которым я являюсь, я, вероятно, в конечном итоге преобразую его в массив символов (если это не очень длинная строка) и буду выполнять глупые трюки с указателями, но это только я.

0 голосов
/ 01 ноября 2010

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

char* i;
for(i = str + strlen(str) - 1; i >= str && *i >= '0' && *i <= '9'; i--);
i++;
0 голосов
/ 01 ноября 2010

Решения на C ++, которые уже опубликованы, довольно разумны.В C вы можете использовать strpbrk.Это дает первое вхождение любого из набора символов, поэтому, если не гарантируется, что цифры появляются в конце строки, вам нужно будет вызывать strpbrk, пока он не вернет ноль, сохраняя результат предыдущего вызова перед следующимвызов.Нет обратного strpbrk, как для strchr, по крайней мере, я знаю об этом.

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