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

Программа-кодировщик. string subscript out of range

20.05.2018, 16:45. Показов 745. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу, осуществляющую сдвиговое шифрование. Изначально реализация выполнялась с помощью функции и программа прекрасно работала. Однако, после того как я переделал её под класс, постоянно начала вылезать ошибка "string subscript out of range" после ввода строки в самой программе. Программа удаляет знаки пунктуация и табуляции, маленькие английские буквы переводит к верхнему регистру. В случае нахождения сторонних символов прекращает работу. Собственно, a - режим работы программы (1 - шифрование, 2 - дешифрование), b и number - величина сдвига. Полагаю, что проблема кроется именно в методе класса, поэтому пока что кидаю только его текст.
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
void Codered::coder(string code, double a, double b)
{
    number = b;
    i = code.size();
    for (k = 0; k < i; k++)
        if (code[k] >= 97 && code[k] <= 122)
            code[k] = code[k] - 32;
    while (j != i)
    {
        if (code[j] >= 65 && code[j] <= 90)
            j++;
        else if (code[j] < -1 || code[j]>255)
            exit(5);
        else if (isspace(code[j]) || ispunct(code[j]))
        {
            code.erase(j,1);
            i--;
            if (i == 0)
                exit(6);
        }
        else exit(5);
    }
    if (a == 1)
    {
        if (number >= 26)
        {
            do
            {
                number = number - 26;
            } while (number >= 26);
        }
        for (k = 0; k < i; k++)
        {
            code[k] = code[k] + number;
            if (code[k] > 90)
                code[k] = code[k] - 26;
            if (code[k] < 65)
                code[k] = code[k] + 26;
        }
    }
 
    if (a == 0)
    {
        if (number >= 26)
        {
            do
            {
                number = number - 26;
            } while (number >= 26);
        }
        for (k = 0; k < i; k++)
        {
            code[k] = code[k] - number;
            if (code[k] > 90)
                code[k] = code[k] - 26;
            if (code[k] < 65)
                code[k] = code[k] + 26;
        }
    }
    return;
}
Добавлено через 1 час 11 минут
Ну и код программы целиком.
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cctype>
using namespace std;
double a, b;
char *a1, *b1;
string code;
class Codered
{
private:
    int i, j, k, number;
public:
    Codered() : i(), j(0), k(0), number(0) {};
    Codered(string code, double a, double b);
    void coder(string code, double a, double b);
    void Output();
};
int main (int argc, char* argv[])
{
    if (argc != 3)
    {
        cerr << "Number of parameters must be 3" << endl;
        return 1;
    }
    if (strlen(argv[1]) != 1)
    {
        cerr << "The second parameter must contain only 1 character" << endl;
        return 2;
    }
    a = strtod(argv[1], &a1);
    b = strtod(argv[2], &b1);
    if (strlen(a1) != 0 || strlen(b1) != 0)
    {
        cerr << "An operand should be a number" << endl;
        return 3;
    }
    if (a != 1 && a != 0)
    {
        cerr << "Mode should be 1 or 0" << endl;
        return 4;
    }
    cout << "Enter string for coding/decoding" << endl;
    getline(cin, code);
    Codered caesar(code, a, b);
    caesar.Output();
    return 0;
}
 
Codered::Codered(string code, double a, double b)
{
    coder(code, a, b);
}
 
void Codered::coder(string code, double a, double b)
{
    number = b;
    i = code.size();
    for (k = 0; k < i; k++)
        if (code[k] >= 97 && code[k] <= 122)
            code[k] = code[k] - 32;
    while (j != i)
    {
        if (code[j] >= 65 && code[j] <= 90)
            j++;
        else if (code[j] < -1 || code[j]>255)
            exit(5);
        else if (isspace(code[j]) || ispunct(code[j]))
        {
            code.erase(j,1);
            i--;
            if (i == 0)
                exit(6);
        }
        else exit(5);
    }
    if (a == 1)
    {
        if (number >= 26)
        {
            do
            {
                number = number - 26;
            } while (number >= 26);
        }
        for (k = 0; k < i; k++)
        {
            code[k] = code[k] + number;
            if (code[k] > 90)
                code[k] = code[k] - 26;
            if (code[k] < 65)
                code[k] = code[k] + 26;
        }
    }
 
    if (a == 0)
    {
        if (number >= 26)
        {
            do
            {
                number = number - 26;
            } while (number >= 26);
        }
        for (k = 0; k < i; k++)
        {
            code[k] = code[k] - number;
            if (code[k] > 90)
                code[k] = code[k] - 26;
            if (code[k] < 65)
                code[k] = code[k] + 26;
        }
    }
    return;
}
 
void Codered:: Output()
{
    cout << code << endl;
    return;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2018, 16:45
Ответы с готовыми решениями:

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

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

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

1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
20.05.2018, 17:40
Цитата Сообщение от Тупиковая Ветвь Посмотреть сообщение
постоянно начала вылезать ошибка "string subscript out of range"
В какой строке кода?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2018, 17:40
Помогаю со студенческими работами здесь

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

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

Тип string и subscript out of range
Доброго времени дня. Такая проблема. Обращаюсь к отдельному элементу массива: #include...

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru