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

Segmentation fault (iterator) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ классы http://www.cyberforum.ru/cpp-beginners/thread1058315.html
помогите не компилируется #include <iostream> #include <cstdlib> #include <vector> #include <map> // ��������� �������� typedef enum { S1, S2, S3 }
C++ Цикл отрицательного веса Помогите переделать решение, нашёл в интернете, но оно немного не подходит, а я никак не могу разобраться в коде и, следовательно, что-либо изменить. Можно обойтись без проверок, но очень помогли бы хоть какие-нибудь комментарии. Условие: Задан ориентированный граф, требуется определить, существует ли в нём цикл отрицательного веса. Использовать для этого метод Форда — Беллмана. Входные... http://www.cyberforum.ru/cpp-beginners/thread1058312.html
Вычислить площадь C++
Помогите. Вычислить площадь трех прямоугольных треугольников, заданных гипотенузой и катетом. Добавлено через 32 минуты 8-)
C++ классы
Не компилируется, помогите #include <iostream> #include <cstdlib> #include <vector> #include <map> // ��������� �������� typedef enum { S1, S2, S3
C++ Составить блок-схему http://www.cyberforum.ru/cpp-beginners/thread1058301.html
начертите блок схему по этому коду . пжлст #include <iostream> #include <vector> using namespace std; bool conectFile(){ if (!freopen ("input.txt", "r", stdin)){ fprintf (stderr, "File input.txt not found!");
C++ Как открыть программу через C++ Как открыть программу через C++ #include "stdafx.h"; #include <iostream> #include <string> #include <Windows.h> using namespace std; int main() { setlocale(LC_ALL, "Russian"); cout << "Нажмите Enter, чтобы открылась программа\n"; подробнее

Показать сообщение отдельно
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.12.2013, 22:38  [ТС]     Segmentation fault (iterator)
Цитата Сообщение от MrGluck Посмотреть сообщение
Он у вас случайно в std::string::npos не уперся?
Выяснилось, что еще и как
Цитата Сообщение от MrGluck Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main()
{
 std::string str1 = "Enik\ai be678@#niki!, eli varenil789^@!ki", str2;
 std::copy_if(str1.begin(), str1.end(), std::back_inserter(str2),
 [](const char x) { return !isalnum(x); } );
 std::cout << str2 << std::endl;
}
В чем прикол? Ваш код генерирует строку со всеми НЕ алфавитно-цировыми символами. Может вас смутило то, что я не создаю новую строку, а заменяю все ненужные символы на пробелы - просто это для меня более оправдано, потому что если удалять символы, то это может привести к перераспределению памяти, что в моем случае критично - иногда строки могут быть чертовски большими (а функция, которой дальше передается эта строка пробелы игнорирует)
outoftime,
Цитата Сообщение от outoftime Посмотреть сообщение
for( ; mainIter != mainIter + capture_pos; ++mainIter)
Собственно вот твой вечный цикл и падение из-за доступа к черту на куличики.
никому об этом не говори, пожалуйста Чувствую себя ... промолчу) Спасибо

Добавлено через 17 часов 18 минут
Может кому понадобится исправленный и оптимизированый вариант. (функция чистит строку, оставляя только валидные для числа символы. Правила описаны в комментариях к коду)
C++ (Qt)
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
70
71
72
73
74
#include <algorithm>
#include <cctype>    // isalnum(), ...
#include <iostream> // std::cerr
#include <string>
#include <boost/regex.hpp>
inline void filter_string(std::string &s) try {
    typedef std::string::iterator SIt_t;
    typedef SIt_t::value_type charT;
    typedef std::string::const_iterator CSIt_t;
    bool withMinus, withDot;
    auto alnum = [](charT c) -> charT {
        return isalnum(c) ? c : ' ';
    };
    char* prevLocale = setlocale(LC_CTYPE, "C");
 
    // If the first non-whitespace character is '-'
    SIt_t mainIter = std::find_if_not(s.begin(), s.end(),
                                     [](char ch) {return isspace(ch);});
    // we consider, that the number is negative, otherwise - non negative.
    if(mainIter == s.end())
        throw prevLocale;
    withMinus = *mainIter == '-' ? true : false;
    if(withMinus)
    {
        // Fill the range from '-' to first digit of the number with spaces and
        // preced this digit with '-'.
        // GMP functions mpf_set_str() and mpz_set_str() in current revision are
        // not allow spaces between minus and first digit of the number.
        // See their documentation for details on [url]https://gmplib.org/manual/[/url]
 
        // Find First Alpha-Numeric Symbol after minus.
        SIt_t fans = std::find_if(mainIter, s.end(),
                                  [](char ch) { return isalnum(ch); });
        if(fans == s.end())
            throw prevLocale;
        else
        {
            mainIter = std::fill_n(mainIter, std::distance(mainIter, fans), ' ');
            *(mainIter-1) = '-';
        }
    }
    // Here we at the position of the first meaning digit of the number.
 
    withDot = std::find(mainIter, s.end(), '.') == s.end() ? false : true;
 
    if(withDot)
    {
        // If in the number presented multiple dots ('.'), only first dot with
        // adjoined one or more alnums is accepted, while others replaced with
        // spaces. GMP funcs mpf_set_str() and mpz_set_str() are simply
        // ignore spaces.
        using namespace boost;
        regex e(R"_([[:alnum:]]+\.[[:alnum:]]+)_", regex_constants::extended);
        smatch what;
        CSIt_t search_begin(mainIter);
        if ( regex_search(search_begin, s.cend(), what, e) )
        {
            SIt_t last = mainIter + what.position();
            mainIter = std::transform(mainIter, last, mainIter, alnum);
            mainIter += what.length();
        }
    }
    std::transform(mainIter, s.end(), mainIter, alnum);
    setlocale(LC_CTYPE, prevLocale);
}
 
catch (const char* prevLoc)
{
    s.assign("0");
    std::cerr << "AbstractConverter::filter_string(std::string&): Exception: "
                 "No valid digits in the number\n";
    setlocale(LC_CTYPE, prevLoc);
    return;
}
 
Текущее время: 20:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru