проверьте, каким числом заканчивается строка в C ++ - PullRequest
0 голосов
/ 11 февраля 2009

В загрузчике файлов C ++ MD2 у меня много фреймов, каждый с именем, заканчивающимся цифрой, например

  • stand0
  • stand1
  • stand2
  • stand3
  • stand4
  • ...
  • stand10
  • stand11
  • run0
  • run1
  • RUN2

и т.д.

Как узнать, какая строка без числа позади? например функция, которая изменила "stand10" на просто "stand"

Ответы [ 5 ]

4 голосов
/ 11 февраля 2009

Просто чтобы показать другой путь, обратные итераторы:

string::reverse_iterator rit = str.rbegin();
while(isdigit(*rit)) ++rit;
std::string new_str(str.begin(), rit.base());

Если у вас есть boost :: bind, вы можете облегчить свою жизнь

std::string new_str(str.begin(),
    std::find_if(str.rbegin(), str.rend(),
                 !boost::bind(::isdigit, _1)).base());
3 голосов
/ 11 февраля 2009

строка :: find_last_not_of ( "0123456789") а потом строка :: зиЬзЬги ()

, которая дает вам позицию последней не цифры / числа. Просто возьмите все предыдущие символы, и это базовое имя.

Увеличивать на единицу, чтобы получить последовательность чисел в конце строки.

Примечание: нет проверки ошибок или других тестов.

#include <string>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
   string test = "hellothere4";

   size_t last_char_pos = test.find_last_not_of("0123456789");
   string base = test.substr(0, last_char_pos + 1);

EDIT

Существует проблема со ВСЕМИ решениями, когда у вашего "базового имени" есть номер в конце.

например, если базовая строка "base1", вы никогда не сможете получить правильное базовое имя. Я полагаю, вы уже знаете об этом.

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

1 голос
/ 11 февраля 2009

Просто для завершения, один с find_first_of:

string new_string = str.substr(0, str.find_first_of("0123456789"));

только одна строка:)

Также для этих вещей мне нравится использовать регулярные выражения (хотя этот случай очень прост):

string new_string = boost::regex_replace(str, boost::regex("[0-9]+$"), "");
1 голос
/ 11 февраля 2009

C-стиль способ сделать это:

Перебирайте вашу строку посимвольно, начиная слева. Когда вы прочитаете число, остановитесь и отметьте его как конец вашей строки.

char *curChar = myString;   // Temporary for quicker iteration.

while(*curChar != '\0') {   // Loop through all characters in the string.
    if(isdigit(*curChar)) { // Is the current character a digit?
        *curChar = '\0';    // End the string.
        break;              // No need to loop any more.
    }

    ++curChar;              // Move onto the next character.
}
0 голосов
/ 11 февраля 2009

Быстро и грязно и не слишком элегантно:

for (int i = str.GetLength()-1; i >= 0; i--)
    {
    if (!isdigit(str.GetAt(i)) break;

    str.SetAt(i,'\0');
    }
...