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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Непонятный выход за пределы подстроки - C++

30.05.2009, 20:10. Просмотров 1059. Ответов 14
Метки нет (Все метки)

Делаю функцию,заполняющую map.Пока это только прототип для одного элемента,потом задам цикл,или вообще придётся переписать с использованием потоков(стоит это делать?).Выдаёт ошибку на этапе выполнения-весьма неприятно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void map_filler(map<string,float>&m)
{
    string str,float_substr,name_substr;
    getline(cin,str);
 
    name_substr=str.substr(str[0],str.find_first_of(' '));//qw 4.567 - this input causes throwing an instance of std::out_of_range
    float_substr=str.substr(str.find_first_of(' ')+1,str.size()-str.find_first_of(' ')-1);
 
    for (unsigned int i=0;i<float_substr.size()+1;++i) cin.putback(float_substr[float_substr.size()-i]);
    float num;
    cin>>num;
    cout<<num<<' '<<float_substr<<' '<<name_substr;
    m[name_substr]=num;
}
name_substr=str.substr(str[0],str.find_first_of(' '));//qw 4.567 - this input causes throwing an instance of std::out_of_range -вот эта строка выдаёт ошибку выхода за пределы подстроки.Просто не понимаю,как это может быть?Я уже методом "тыка" всё перепробовал,всё не то.Ведь str.find_first_of(' ') возвращает число int,номер позиции элемента,всё должно работать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2009, 20:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятный выход за пределы подстроки (C++):

Выход за пределы памяти - C++
подскажите почему вылазит за пределы памяти присвоение в 25 строке как сделать чтобы работало#include &lt;iostream&gt; #include &lt;cstring&gt; ...

Выход за пределы вектора - C++
Добрый день, решаю задачку на динамическое программирование, нужно левый столбец и верхнюю строку заполнить числами от 1 до y-1 и x-1...

Выход за пределы массива - C++
Столкнулся со следующей проблемой. Ввожу по формату: Мой код при выполнении выдаёт ошибку. Выход за пределы массива (Access...

Выход за пределы вектора - C++
выход за пределы вектора, я новичок, и не могу найти причину ошибки. Это черновик, но он должен работать. Проблема в показе записанных...

Выход за пределы массива - C++
Где-то здесь происходит выход за пределы массива puti, но я не могу его найти уже второй день. Объясните, пожалуйста, в чем моя проблема и...

Выход за пределы массива - C++
#include &lt;assert.h&gt; #include &lt;assert.h&gt; #include &lt;string.h&gt; #include &lt;stdint.h&gt; #include &lt;limits.h&gt; int get_bit(const void...

14
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 20:16 #2
А строка то какая?
0
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.05.2009, 20:20  [ТС] #3
Всмысле?Строка,определённая в файле <string>.Т.е. стандартная строка в С++.Ввожу строку,разорванную пробелом,например:
C++
1
 qw 2.456
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
30.05.2009, 20:20 #4
во-первых, быдлокод
во-вторых, не читаешь доку

substr первым параметром принимает ПОЗИЦИЮ в строке, откуда вырезать, а у тебя что!!! Хрень какая-то!
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.05.2009, 20:24  [ТС] #5
Блин,я аж покраснел)) обязательно улучшу
Невнимательный,пропустил,что это позиция, в упор не увидел =))
Я так понимаю,лучше всё сделать через потоки ввода вывода,чтобы не дёргать лишние сущности?
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
30.05.2009, 20:30 #6
#pragma,
быдлокод в том смысле, что он совершенно небезопасный. (:

Множественные нарушения пункта 2 Кодекса Программиста
Правило 2: Никогда не доверяйте данным
Все входящие данные – зло, пока не доказано обратного.
1
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
30.05.2009, 20:35 #7
Афтар выпей яду =)
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.05.2009, 20:38  [ТС] #8
Ясно.Ну в данном случае map просто создаётся,и сразу закидывается в функцию для заполнения.А вообще да,я что-то не подумал,а что там с размерностью этого map?Что-то пока про это не видел в книжке,только про векторы.

Добавлено через 46 секунд
Search.., неужели фсё так плохо за яд спасибо,вкусный
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
30.05.2009, 20:48 #9
А вообще да,я что-то не подумал,а что там с размерностью этого map?
как и у других контейнеров stl, размерность динамически-наращиваемая.

m[name_substr]=num;
в этой строчке если ключа name_substr нет, то он будет создан, иначе - заменён.

и я бы переписал эту строчку так:
C++
1
2
3
4
typedef std::map<std::string, float> Map;
Map::iterator i=m.find(name_substr);
if (i != m.end())
    i->second = num;
Щас точно не помню кто именно, но кто-то из Зубров (Элджер/Мейерс/Cаттер...) очень доходчиво расписал почему запись вида m[] = ... является неоптимальной.

ps. Не пиши using namespace std в хеадере, не будь ламером
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.05.2009, 21:31  [ТС] #10
Цитата Сообщение от Rififi Посмотреть сообщение
А вообще да,я что-то не подумал,а что там с размерностью этого map?
как и у других контейнеров stl, размерность динамически-наращиваемая.

m[name_substr]=num;
в этой строчке если ключа name_substr нет, то он будет создан, иначе - заменён.

и я бы переписал эту строчку так:
C++
1
2
3
4
typedef std::map<std::string, float> Map;
Map::iterator i=m.find(name_substr);
if (i != m.end())
    i->second = num;
Щас точно не помню кто именно, но кто-то из Зубров (Элджер/Мейерс/Cаттер...) очень доходчиво расписал почему запись вида m[] = ... является неоптимальной.

ps. Не пиши using namespace std в хеадере, не будь ламером
1)(i != m.end()) что это и почему?По умолчанию все элементы добавляются в конец map,и это проверка,что ключ создан?И где в твоём коде создание name_substr?
0
Search..
30.05.2009, 21:34
  #11

Не по теме:

Возможно, я могу чем-то помочь...

0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
30.05.2009, 22:10 #12
1)(i != m.end()) что это и почему?По умолчанию все элементы добавляются в конец map,и это проверка,что ключ создан?
Это проверка что ключ имеется в мапе, а раз так, то можно юзать итератор.
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
31.05.2009, 22:59  [ТС] #13
Цитата Сообщение от Rififi Посмотреть сообщение
#pragma,
быдлокод в том смысле, что он совершенно небезопасный. (:

Множественные нарушения пункта 2 Кодекса Программиста
А как можно проверить,что значение является валидным значением определённого типа?Есть какая-то функция для этого?

Добавлено через 3 часа 13 минут 14 секунд
Ещё такой вопрос:при простом вызове элемента m[name_substr] что произойдёт?Например,у нас есть свежая строка name_substr,которой ещё нет в map,то тогда при таком вызове создастся ключ и по умолчанию у него будет какой-то индекс int?
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
31.05.2009, 23:11 #14
Цитата Сообщение от #pragma Посмотреть сообщение
Ещё такой вопрос:при простом вызове элемента m[name_substr] что произойдёт?Например,у нас есть свежая строка name_substr,которой ещё нет в map,то тогда при таком вызове создастся ключ и по умолчанию у него будет какой-то индекс int?
.
вот
A call to this function is equivalent to:

(*((this->insert(make_pair(x,T()))).first)).second
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
31.05.2009, 23:51  [ТС] #15
Эх,спасибо,ребятки,выручаете)) У Страуструпа всё по книге раскидано(нашёл я наконец ту строчку от Humanitis,всё как написал=))
Решил попробовать сделать по совету Rififi,добавил ещё анализатор простенький для текста,ну и это
C++
1
2
pairs_map::iterator i=m.find(str_substr);
 if (i != m.end()) i->first=str_substr;
Даёт ошибку /media/Part2/C++/Projects/CodeBlocks/6.6/6.6.3.cpp|29|ошибка: passing ‘const std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ discards qualifiers| Так что не знаю,нужно inserter или ещё чего,буду ковырять. i->second проходит... там что-то вроде свойство константы теряется где-то по дороге,так понял?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2009, 23:51
Привет! Вот еще темы с ответами:

Выход за пределы цикла - C++
Вообщем необходимо реализовать алгоритм по пунктам от 1 до 27 и в них есть переходы на другие пункты. Есть 2 цикла do while, один от 5 до...

Выход за пределы вектора - C++
Проблэм: запускается, но после записи символов выдает ошибку, мол, вектор вышел за пределы... Как исправить кто знает? #include...

Выход за пределы вектора - C++
Здравствуйте, столкнулся с проблемой, что программа экстренно останавливает работу и пишет, что произошел выход за пределы выхода....

Выход за пределы вектора - C++
Программа кодирует несколько чисел в одно. Проблема состоит в том, что когда используется рекурсия в функции С(int x, vector&lt;int&gt;y)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
31.05.2009, 23:51
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru