Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.11.2019
Сообщений: 38

string subscript out of range (строковый индекс вне диапазона)

17.12.2021, 01:42. Показов 1284. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:
В заданной строке текста найдите максимальное и минимальное по
длине слова и выведите их и их длинны. Если таких слов несколько выведите все.

При запуске появляется ошибка string subscript out of range.
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
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <time.h>
using namespace std;
int main()
{
            setlocale(LC_ALL, "Russian");
                string max_word, min_word;
        short g;
        short dl_max = 0, dl_min = 100, dl_temp = 0;
        string str4 = "Eto stroka teksta ishem samoe dlinnoe i korotkoe slovo";
        for (size_t i = 0; i < str4.length(); i++)
        {
            if (str4[i] != ' ')
            {
                dl_temp += 1;
                continue;
            }
            if (dl_max < dl_temp)
            {
                dl_max = dl_temp;
                g = 0;
                for (size_t j = i - dl_max; j <= i; j++)
                {
                    max_word[g] = str4[j];
                    g += 1;
                }
            }
            if (dl_min > dl_temp)
            {
                dl_min = dl_temp;
                g = 0;
                for (size_t j = i - dl_min; j <= i; j++)
                {
                    min_word[g] = str4[j];
                    g += 1;
                }
            }
            if (str4[i] == ' ')
            {
                dl_temp = 0;
            }
        }
        cout << endl << "Исходная строка: " << str4 << endl;
        cout << "Максимальное слово в строке: " << max_word << endl;
        cout << "Длинна максимального слова = " << dl_max << endl;
        cout << "Минимальное слово в строке: " << min_word << endl;
        cout << "Длинна минимального слова = " << dl_min << endl;
        return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2021, 01:42
Ответы с готовыми решениями:

ошибка 9 - Subscript out of range - Индекс вне заданного диапазона
здравствуйте, не понимаю, эту строку MsgBox$ Trim(c(w)) отрабатывает, получаю правильный ответ &quot;три картонные коробки&quot; на...

String subscript out of range
Почитала на форуме, что данная ошибка появляется при выходе за границы массива. Задача - найти самое длинное слово. Крашится программа на...

String subscript out of range
Здравствуйте! Выбивает ошибку &quot;string subscript out of range&quot;, хотя все предложение, которое находится в тексте выводит на экран. Что...

6
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,225
17.12.2021, 04:54
Цитата Сообщение от xmmmm Посмотреть сообщение
При запуске появляется ошибка string subscript out of range.
Ну так разумеется.

Цитата Сообщение от xmmmm Посмотреть сообщение
string max_word, min_word;
Это - пустые строки, т.е. строки длины 0.

Цитата Сообщение от xmmmm Посмотреть сообщение
max_word[g] = str4[j];
Цитата Сообщение от xmmmm Посмотреть сообщение
min_word[g] = str4[j];
И что тогда такое max_word[g] и min_word[g]?

Отдельный вопрос: зачем вы писали все эти циклы, если вы и так уже пользуетесь классом std::string, который всю эту функциональность предоставляет в готовом виде?

Цитата Сообщение от xmmmm Посмотреть сообщение
if (str4[i] == ' ')
В чем смысл этого if, если в этом месте заведомо известно, что условие истинно?

Добавлено через 3 минуты
Цитата Сообщение от xmmmm Посмотреть сообщение
short g;
short dl_max = 0, dl_min = 100, dl_temp = 0;
short? Это для "экономии памяти" что ли? Почему тогда здесь

Цитата Сообщение от xmmmm Посмотреть сообщение
for (size_t i = 0; i < str4.length(); i++)
внезапно size_t?
1
0 / 0 / 0
Регистрация: 28.11.2019
Сообщений: 38
17.12.2021, 10:28  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это - пустые строки, т.е. строки длины 0.
А, строкам длину надо дать, вот оно что.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Отдельный вопрос: зачем вы писали все эти циклы, если вы и так уже пользуетесь классом std::string, который всю эту функциональность предоставляет в готовом виде?
Изначально писал для массива символов char, но потом решил под string переделать, да и с классом string не особо знаком, не знаю всех готовых решений, поэтому писал вручную.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В чем смысл этого if, если в этом месте заведомо известно, что условие истинно?
Оно же истинно когда мы встречаем пробельный символ, разве не так?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
short? Это для "экономии памяти" что ли? Почему тогда здесь
Ну да, short тут вполне хватает

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
внезапно size_t?
Были предупреждения при компиляции о несоответствии типов со знаком и без знака, посмотрел в инете, советовали использовать size_t.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.12.2021, 11:51
Цитата Сообщение от xmmmm Посмотреть сообщение
Ну да, short тут вполне хватает
Вам, наверное, забавно будет узнать, что компилятор все равно разместит эти данные в регистре (соответствующему типу int для целевой платформы), полностью проигнорировав ваши попытки "сэкономить".

Цитата Сообщение от xmmmm Посмотреть сообщение
Оно же истинно когда мы встречаем пробельный символ, разве не так?
Речь, видимо шла о том, что условие вначале цикла (строка 17)
C++
1
if (str4[i] != ' ')
и находящийся под ним continue полностью отсекает любую возможность попадания ниже по контексту выполнения чего-то кроме собственно пробела. Поэтому еще раз проверять, что там точно пробел, бессмысленно.
1
0 / 0 / 0
Регистрация: 28.11.2019
Сообщений: 38
17.12.2021, 12:03  [ТС]
Ладно, пусть будет так, работает и хорошо)
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
string str4 = "Eto stroka teksta ishem samoe dlinnoe i korotkoe slovo, esli takih slov neskolko vivodim vse";
        const int n4 = 30;
        string max_word[n4], min_word[n4];
        short g_min = 0, g_max = 0;
        short dl_max = 0, dl_min = 100, dl_temp = 0;
        for (size_t i = 0; i < str4.length(); i++)
        {
            if (str4[i] != ' ')
            {
                dl_temp += 1;
                continue;
            }
            if (dl_max <= dl_temp)
            {
                if (dl_max < dl_temp)
                {
                    g_max = 0;
                    // чистим строку с максимальным(ми) словами
                    for (short i = 0; i < n4; i++)
                    {
                        max_word[i] = ' ';
                    }
                }
                dl_max = dl_temp;
                for (size_t j = i - dl_max; j <= i; j++)
                {
                    max_word[g_max] = str4[j];
                    g_max += 1;
                }
            }
            if (dl_min >= dl_temp)
            {
                if (dl_min > dl_temp)
                {
                    g_min = 0;
                    // чистим строку с минимальны(ми) словами
                    for (short i = 0; i < n4; i++)
                    {
                        min_word[i] = ' ';
                    }
                }
                dl_min = dl_temp;
                for (size_t j = i - dl_min; j <= i; j++)
                {
                    min_word[g_min] = str4[j];
                    g_min += 1;
                }
            }
            if (str4[i] == ' ')
            {
                dl_temp = 0;
            }
        }
        cout << endl << "Исходная строка: " << str4 << endl;
        cout << "Максимальное слово в строке: ";
        for (short i = 0; i < n4; i++)
        {
            cout << max_word[i];
        }
        cout << endl << "Длинна максимального слова = " << dl_max << endl;
        cout << "Минимальное слово в строке: ";
        for (short i = 0; i < n4; i++)
        {
            cout << min_word[i];
        }
        cout << endl << "Длинна минимального слова = " << dl_min << endl;
Добавлено через 11 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Вам, наверное, забавно будет узнать, что компилятор все равно разместит эти данные в регистре (соответствующему типу int для целевой платформы), полностью проигнорировав ваши попытки "сэкономить".
Не знал

Цитата Сообщение от DrOffset Посмотреть сообщение
Речь, видимо шла о том, что условие вначале цикла (строка 17)
if (str4[i] != ' ')
и находящийся под ним continue полностью отсекает любую возможность попадания ниже по контексту выполнения чего-то кроме собственно пробела. Поэтому еще раз проверять, что там точно пробел, бессмысленно.
А да, действительно
C++
1
if (str4[i] == ' ')
лишняя проверка, можно убрать
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
17.12.2021, 12:30
Лучший ответ Сообщение было отмечено xmmmm как решение

Решение

Цитата Сообщение от xmmmm Посмотреть сообщение
пусть будет так
Может все-таки лучше хотя бы так?
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
int main()
{
        string str4 = "Eto stroka teksta ishem samoe dlinnoe i korotkoe slovo, esli takih slov neskolko vivodim vse";
 
        string max_word, min_word;
        size_t dl_max = 0, dl_min = str4.length(), dl_temp = 0;
        for (size_t i = 0; i < str4.length(); i++)
        {
            if (str4[i] != ' ')
            {
                dl_temp += 1;
                continue;
            }
            if (dl_max <= dl_temp)
            {
                if (dl_max < dl_temp)
                {
                    // чистим строку с максимальным(ми) словами
                    max_word.clear();
                }
                dl_max = dl_temp;
 
                max_word.append(&str4[i - dl_max], &str4[i + 1]);
            }
            if (dl_min >= dl_temp)
            {
                if (dl_min > dl_temp)
                {
                    // чистим строку с минимальным(ми) словами
                    min_word.clear();
                }
                dl_min = dl_temp;
 
                min_word.append(&str4[i - dl_min], &str4[i + 1]);
            }
            dl_temp = 0;
        }
        cout << endl << "Исходная строка: " << str4 << endl;
        cout << "Максимальное слово в строке: ";
        cout << max_word;
        cout << endl << "Длина максимального слова = " << dl_max << endl;
        cout << "Минимальное слово в строке: ";
        cout << min_word;
 
        cout << endl << "Длина минимального слова = " << dl_min << endl;
}
Добавлено через 5 минут
Цитата Сообщение от xmmmm Посмотреть сообщение
C++
1
if (str4[i] != ' ')
Кстати, предлагаю подумать что будет, если расставить в вашем исходном предложении знаки препинания так, как того требует русский язык.

Подсказка: знаки препинания - это не часть слова.
1
0 / 0 / 0
Регистрация: 28.11.2019
Сообщений: 38
17.12.2021, 13:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Может все-таки лучше хотя бы так?
Да, тут для оптимизации и упрощения целая дорога, я понимаю. Но мне в данном случае это не столь важно. В любом случае спасибо)

Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, предлагаю подумать что будет, если расставить в вашем исходном предложении знаки препинания так, как того требует русский язык.
Подсказка: знаки препинания - это не часть слова.
Тоже были мысли об этом, но решил не заморачиваться, можно вот так в принципе:
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
int main()
{
        string str4 = "Eto stroka teksta ishem samoe dlinnoe i korotkoe slovo, esli takih slov neskolko vivodim vse";
 
        string max_word, min_word;
        size_t dl_max = 0, dl_min = str4.length(), dl_temp = 0;
        for (size_t i = 0; i < str4.length(); i++)
        {
            if ((str4[i] != ' ') && (str4[i] != ',') && (str4[i] != ':') && (str4[i] != '.') && (str4[i] != ';') && (str4[i] != '!') && (str4[i] != '?') && (str4[i] != '-'))
            {
                dl_temp += 1;
                continue;
            }
            if (dl_max <= dl_temp)
            {
                if (dl_max < dl_temp)
                {
                    // чистим строку с максимальным(ми) словами
                    max_word.clear();
                }
                dl_max = dl_temp;
 
                max_word.append(&str4[i - dl_max], &str4[i + 1]);
            }
           if (dl_min >= dl_temp && dl_temp != 0)
            {
                if (dl_min > dl_temp)
                {
                    // чистим строку с минимальным(ми) словами
                    min_word.clear();
                }
                dl_min = dl_temp;
 
                min_word.append(&str4[i - dl_min], &str4[i + 1]);
            }
            dl_temp = 0;
        }
        cout << endl << "Исходная строка: " << str4 << endl;
        cout << "Максимальное слово в строке: ";
        cout << max_word;
        cout << endl << "Длина максимального слова = " << dl_max << endl;
        cout << "Минимальное слово в строке: ";
        cout << min_word;
 
        cout << endl << "Длина минимального слова = " << dl_min << endl;
}
Опять же, я думаю можно было как нибудь грамотней это оформить, но это уже совсем другая история)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2021, 13:52
Помогаю со студенческими работами здесь

String subscript out of range
#include &lt;SFML/Graphics.hpp&gt; #include &lt;sstream&gt; #include &lt;iostream&gt; using namespace sf; const int H = 5; const int W = 15; ...

String subscript out of range
Всем привет, писал программу шифратора и дешифратора шифров Цезаря и Виженера, но в один момент после добаления функции шифрации и...

String subscript out of range
Разбираю пример, который дала препод в примерах к лекциям..Пример по коду Виженера.. Пару раз запустился-результат выводился.Исправила...

String subscript out of range
При запуске выдает ошибку &quot;string subscript out of range&quot;. Подскажите, в чем проблема. #include &lt;iostream&gt; #include...

Expression: string subscript out of range
Программа должна выводить кол-во повторов символов в тексте но почему то выводит ошибку Expression: string subscript out of range Вот...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru