Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
1 / 1 / 3
Регистрация: 12.10.2012
Сообщений: 150
1

String subscript out of range

02.03.2017, 22:24. Показов 4055. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разбираю пример, который дала препод в примерах к лекциям..Пример по коду Виженера.. Пару раз запустился-результат выводился.Исправила только алфавит на кириллицу,и поставила на некоторые строки коменты.Теперь консолька запускается, начальный этап проходит, но потом результат не выводится, и консолька просто виснет..и выбивает это сообщение про "Debug assertion failed : 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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// 11.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <string>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    string TEXT, KEY, D = "";
    string A = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ-_,."; //наш алфавит
    setlocale(LC_ALL, "Rus");
    cout << "Введите предложение: ";
    cin >> TEXT;
    KEY =  "МАРИНА";
    int *F = new int[TEXT.size()];
    int *G = new int[TEXT.size()];
    int key = KEY.size(); //делаем замену переменных для удобства
    int text = TEXT.size();
    
    if (text >= key)//Первое условие. Если длина вводимого слова больше, либо равна длине ключа
    {
        for (int i = 0; i < (text / key); i++)
        {
            D = D + KEY; //Записываем целое количество ключа. Растягивая ключ по длине слова.
        }
        for (int j = 0; j < (text%key); j++)
        {
            D = D + KEY[j];
        }
    }
    else  //Иначе если ключ длиннее слова, укорачиваем ключ до длины слова.
    {
        for (int s = 0; s < text; s++)
        {
            D = D + TEXT[s];
        }
    }
 
//cout<<"Распишем ключ под текст: ";
//cout << D << endl;
 
    for (int k = 0; k < text; k++)//Здесь мы уже начинаем шифровать.
    {
        for (int n = 0; n < 36; n++)
        {
            if (TEXT[k] == A[n])// Смысл заключается втом, что мы ищем номер буквы во вводимом ключе и номере, 
            {
                F[k] = n;
            }
 
            if (D[k] == A[n])
            {
                G[k] = n;
            } ///И после чего записываем их в массив
 
        }
    }
 
    int e = 0; //Для суммы номеров символов. Чтобы при достижении 36 буквы или символа, программа шла по кругу, начиная с первого номера
bool shifr;
cout<<"для шифрования введите 1, для расшифровки нажмите 0: ";
cin>>shifr;
if (shifr==1){
    for (int u = 0; u < text; u++)
    {
        e = ((F[u] + G[u]) % 36);
        TEXT[u] = A[e];
    }
 }
else
    for (int u = 0; u < text; u++)
    {
        e = ((F[u] - G[u]));
        if (e<0)
            e+=36;
        TEXT[u] = A[e];
    }
    cout << "Зашифрованное слово: " << TEXT << endl;
 
    
    _getch();
    return 0;
 
}


По пошаговой отладке понимаю что проблема вроде как с загрузкой символов на 81 строчке.. А как сделать чтоб работало нормально-правильно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2017, 22:24
Ответы с готовыми решениями:

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

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

String subscript out of range
#include &lt;SFML/Graphics.hpp&gt; #include &lt;sstream&gt; #include &lt;iostream&gt; using namespace sf; const...

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

9
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
02.03.2017, 22:34 2
в вашей 81 строке ничего такого, что может родить ассерт не происходит.
поведение вашей программы зависит от того, что вы там вводите. я вбил что-то от балды и ассертов не было.
в таких случаях вводные данные надо писать тут, а еще лушче тупо хардкодить, вместо того, чтобы запрашивать
у пользователя их ввод. сильно экономит время всем. после отладки хардкод можно убирать.
ну и до кучи почитайте третий пост из темы:
Как пользоваться отладчиком (в Visual Studio)
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
02.03.2017, 22:48 3
Особо не вникал в код, но, пройдя отладчиком, у вас после 69 строки
C++
1
        e = ((F[u] + G[u]) % 36);
переменная e в любом случае будет содержать очень большое число, которое потом используется как индекс символа в строке, а размер строки явно меньше чем это число, вот и ошибка выхода за границы string.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
02.03.2017, 22:54 4
Цитата Сообщение от Маринчик Посмотреть сообщение
По пошаговой отладке понимаю
Найди точное место в коде, где ошибка вылетает. Судя по ошибке, где-то выходишь за границу string, значит внимание к местам, где к string A по индексу обращаешься. Например:
C++
1
2
3
4
        e = ((F[u] - G[u]));
        if (e<0)
            e+=36;
        TEXT[u] = A[e];
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
02.03.2017, 22:55 5
Цитата Сообщение от Lambont Посмотреть сообщение
переменная e в любом случае будет содержать очень большое число
От нуля до 35 - вроде не очень большое. А в массиве А как раз 36 элементов.
Точнее, 37 элементов, так что делить по модулю нужно на 37, если я правильно понял алгоритм.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
02.03.2017, 22:57 6
Цитата Сообщение от Lambont Посмотреть сообщение
еременная e в любом случае будет содержать очень большое число
Тут, как раз, не будет. Здесь от 0 до 35.

Добавлено через 55 секунд
Цитата Сообщение от likehood Посмотреть сообщение
А в массиве А как раз 36 элементов.
37.
0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
02.03.2017, 23:05 7
Цитата Сообщение от likehood Посмотреть сообщение
От нуля до 35 - вроде не очень большое. А в массиве А как раз 36 элементов.
Цитата Сообщение от nd2 Посмотреть сообщение
Тут, как раз, не будет. Здесь от 0 до 35.
Странно, у меня явно переменная е после 69 строки всегда отрицательное значение имеет, чтобы я не вводил, и именно здесь мне бросает исключение выхода за границы
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
02.03.2017, 23:13 8
Цитата Сообщение от Lambont Посмотреть сообщение
е после 69 строки всегда отрицательное значение имеет,
Отрицательный индекс - это тоже выход за границу.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
02.03.2017, 23:17 9
Кажется понял в чём дело. Если строка содержит только символы алфавита, то программа не вылетает. Но если есть хотя бы один пробел или например цифра, то 51 строка не будет выполнена и этот элемент массива не будет инициализирован. Отсюда и все глюки.

Кроме того, для корректного ввода русских букв нужно в начале программы добавить строки
C++
1
2
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
Ну и естественно, шифруемый текст должен содержать только большие буквы.

---
Я бы вообще сначала отладил программу для английского алфавита, а потом при желании добавил поддержку русского.
1
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
02.03.2017, 23:18 10
Цитата Сообщение от nd2 Посмотреть сообщение
Отрицательный индекс - это тоже выход за границу.
Вот вот, я и о том же. Я даже больше скажу, у меня и после 76 строки
C++
1
        e = ((F[u] - G[u]));
в е космические числа, видимо в массивах F и/или G что-то не-то происходит... дойду до дома - подробнее посмотрю тогда
0
02.03.2017, 23:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2017, 23:18
Помогаю со студенческими работами здесь

Ошибка string subscript out of range
Нужно заменить символ 'w' на 'v'. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Ошибка String subscript out of range
Здравствуйте. Написал на Dev C++ 4.9.9.2 программу которая открывает фаил и кладет все в буфер....

Ошибка: string subscript out of range
Задача: Расстоянием Хэмминга двух строк a и b одинаковой длины называется количество позиций, в...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru