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

Удалить комментарии из строки - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вычислить значение функции http://www.cyberforum.ru/cpp-beginners/thread351404.html
помогити решить вот эти задачи мы недавно начели С и я в этом нулевой пока что зарание спасибо всем. Задача1. Даны три вещественных числа. Проверить: образуют ли данные числа возрастающую последовательность. Задача2. Задача3. буду очень благодарен за помощь
C++ Помогите с обучением С++ Если есть у кого небудь есть свободное время..прошу поучить меня С++ с нуля) http://www.cyberforum.ru/cpp-beginners/thread351354.html
C++ Указатель на массив char и прочее
Страуструп для проверки прочитанного в заданиях после одной из глав просит через typedef сделать пару объявлений и вот как делать некоторые из них я что-то не понял, в частности: Используйте typedef для определения типов: - указатель на массив char ... - массив из 7 указателей на int - указатель на массив из 7 указателей на int
C++ Даны вещественные массивы a[13] и k [13], для каждого массива определить...
Даны вещественные массивы a и k , для каждого массива определить минимальный положительный элемент и средне гармоническое всех отрицательных элементво массива.
C++ вычислить сумму элементов,расположенных между максимальным и минимальным элементом http://www.cyberforum.ru/cpp-beginners/thread351318.html
вычислить сумму элементов,расположенных между максимальным и минимальным элементом (первыми по порядку, если их нескглько) Если вычислить сумму не удается, выдать сообщерие с указанием причины.
C++ Русские буквы Ребят всем привет!!! Подскажите мне пожалуйста такую вещь,хочу в С++ чтобы на русском выводилось,компилирую в Dev C++,у меня каляки маляки выходят,то есть в компиляторе например пишу "Привет" в командной строке вижу "оыаотд" подробнее

Показать сообщение отдельно
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 12:46     Удалить комментарии из строки
а разве конец коммента не должен быть после слова "да"?
первый вариант так и работал.
второй вариант сделал "жадным" (до последнего валидного закрытия без открытия.)
первый вариант выглядит немного страшнее, но тоже ничего сложного.

один цикл без рекурсий.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
std::string remove_comment(const std::string &in) {
 
    enum state_t {
        state_clean = 0,
        state_rem
    } state = state_clean;
 
    typedef std::string::const_iterator strcitr;
    struct str_tok {
        enum {
            token_open = 0,
            token_close,
            token_def
        } token;
        str_tok(): token(token_def) {}
        const strcitr operator()( const strcitr &input, const strcitr &end ) {
            strcitr next_itr;
            if((input != end) && ((next_itr = input + 1) != end)) {
                const char cur = *input;
                const char next = *next_itr;
                switch( cur ) {
                    case '/':
                        if(next == '*') {
                            token = token_open;
                            return next_itr;
                        }
                        break;
                    case '*':
                        if(next == '/' && (token != token_close) ) {
                            token = token_close;
                            return next_itr;
                        }
                        break;
                }
            }
            token = token_def;
            return input;
        }
    } get_tok;
 
    std::string out;
    strcitr itr;
 
    out.reserve(in.size());
    int opened = 0;
 
    for(itr = in.begin(); itr!=in.end(); itr = get_tok(++itr, in.end())) {
        switch( state ) {
        case state_clean:
            if( get_tok.token == str_tok::token_open ) {
                opened++;
                state = state_rem;
            } else if( get_tok.token == str_tok::token_close ) {
                out += "*/";
            } else {
                out.push_back(*itr);
            }
            break;
        case state_rem:
            if( get_tok.token == str_tok::token_close ) {
                if(--opened == 0) state = state_clean;
            } else if(get_tok.token == str_tok::token_open) {
                ++opened;
            }
            break;
        }
    }
    return out;
}
Кстати в варианте xAtom ошибка
C++
1
 char test[] = "1234/**/*/**/56789";
ожидаемо 1234*56789
получается 1234/**/*56789
или как пример "1234/**//**//*56789"
ожидаемо 1234
выводит без изменений. Хотя если принять такую строку за невалидную, то все в норме.

Добавлено через 21 минуту
Кстати в варианте xAtom ошибка
и еще одна
"***/" некорректно обрабатывает.
 
Текущее время: 15:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru