Форум программистов, компьютерный форум CyberForum.ru

Регулярные выражения (regex) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ всеми любимые структуры http://www.cyberforum.ru/cpp-beginners/thread809096.html
/*Написать программу, которая выполняет следующие действия: • вводит с клавиатуры данные в массив, состоящий из десяти структур; записи должны быть размещены по алфавиту; • выводит на дисплей фамилии работников, чей стаж работы в организации превышает значение, введенное с клавиатуры; • если таких работников нет, вывести на дисплей соответствующее сообщение.*/ #include <iostream> using...
C++ Массив: Посчитать количество элементов массива, равных последнему В одномерном массиве Y, состоящем из N целых элементов, вычислить: a) количество элементов, равных последнему элементу массива; b) среднее арифметическое элементов, кратных 3. http://www.cyberforum.ru/cpp-beginners/thread809085.html
C++ Работа с матрицами. В центре каждого квадрата поместить сумму остальных элементов квадрата
Заполнить матрицу случайными числами. Разбить матрицу на квадраты размером 3х3. В центре каждого квадрата поместить сумму остальных элементов квадрата.
Заполнить секторы матрицы, которые лежат влево и вправо от главной и побочной диагоналей ЛП, от левого верхнего угла вправо - вниз C++
Заполнить секторы матрицы, которые лежат влево и вправо от главной и побочной диагоналей ЛП, от левого верхнего угла вправо - вниз. Остаток матрицы заполнить нулями.
C++ Простые числа, используем циклы http://www.cyberforum.ru/cpp-beginners/thread809078.html
Надеюсь кто-то поможет составить программу, а то я уже на листике считал для проверки)) исписал маленьким шрифтам весь лист А4):wall: Условия задачи такое: Определить количество простых чисел, попадающих в диапазон допустимых значений типа unsigned short int. Кто решиться углубиться в этом вопросе, да и проверить себя, то еще было бы неплохо еслиб выводился номер простого числа и само его...
C++ Унаследование классов Главный класс. class CStart { public: void Start( ); }; Унаследование: подробнее

Показать сообщение отдельно
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
15.03.2013, 06:18     Регулярные выражения (regex)
Нужно извлечь строку из переменной класса smatch. Пробовал через преобразование string(smatch_var) и через потоки, и во всех способах оказывается задействована функция str(). Вот текст тестовой программы:

C++
1
2
3
4
5
6
7
8
9
#include <regex>
using namespace std;
 
int main() {
    smatch m;
    if(regex_search(string("asssdf"),m,regex("sss"))) {
        m.str(); //<------ ошибка
    }
}
Конкретно ошибка возникает в файле xutility:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class _RanIt> inline
    void _Debug_range2(_RanIt _First, _RanIt _Last,
        _Dbfile_t _File, _Dbline_t _Line,
        random_access_iterator_tag)
    { // test iterator pair for valid range, random-access iterators
    if (_First != _Last) //<---------------------------------------- ошибка
        { // check for non-null pointers, valid range
        _DEBUG_POINTER2(_First, _File, _Line);
        _DEBUG_POINTER2(_Last, _File, _Line);
        if (_Last < _First)
            _DEBUG_ERROR2("invalid iterator range", _File, _Line);
        }
    }
Здесь _First и _Last (тип string::const_iterator) имеют значения "sssdf" и "df" соответственно (значения появляются, если в MVS навести курсор на переменную; видимо, это строки, на которые ссылается указатель). Суть сообщения об ошибке: "Expression: string iterators incompatible". Конкретно (если залезть еще глубже) это появляется здесь (файл xstring):

C++
1
2
3
4
5
6
7
8
9
void _Compat(const _Myiter& _Right) const
    { // test for compatible iterator pair
    if (this->_Getcont() == 0
        || this->_Getcont() != _Right._Getcont())
        { // report error
        _DEBUG_ERROR("string iterators incompatible");
        _SCL_SECURE_INVALID_ARGUMENT;
        }
    }
В функцию _Getcont дебаггер заходит только один раз, так что скорее всего выполнено условие this->_Getcont() == 0. Проблема решается с использованием неявного преобразования в string и функции length():

C++
1
2
3
4
5
6
7
8
9
10
11
#include <regex>
#include <iostream>
using namespace std;
 
int main() {
    smatch m;
    string s="asssdf";
    if(regex_search(s,m,regex("sss"))) {
        cout << s.substr(s.find(m[0]),m[0].length()) << endl; // OK
    }
}
Причем во время преобразования используется та же функция str(), но в этот раз функция _Compat не выдает ошибку, хотя значения итераторов те же самые. Почему так происходит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru