Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для KostyaKulakov
64 / 52 / 2
Регистрация: 02.07.2012
Сообщений: 391
Записей в блоге: 2

Переворот строки. Необработанное исключение. Нарушения прав доступа

29.08.2012, 14:24. Показов 2738. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
void turn(char c[], int step, int size)
{
    if(step < size>>1)
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2[size-step-1];
        c[size-step-1] = temp[step];
        turn(c,++step,size);
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2012, 14:24
Ответы с готовыми решениями:

Нарушения прав доступа при записи. Исключение
Здравствуйте! Выскочило исключение - с таким исключением впервые стыкаюсь. Что это и почему оно вылезло, как исправить? Это запись в...

Необработанное исключение нарушение прав доступа
Можно ли отловить исключение, которое потом выдает компилятор как &quot;необработанное исключение нарушение прав доступа&quot; Если можно, то...

Необработанное исключение: нарушение прав доступа при записи
Есть функция ввода текста. Текст с неизвестным количеством и длиной строк. При отладке прерывается и выдает: &quot;Необработанное...

29
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
29.08.2012, 14:28
C++
1
2
    char str[256] = "hello";
    turn(str,0,strlen(str));
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 17:39
Здравствуйте. Назрел глупый вопрос, с которым мучаюсь несколько часов. Пишу одному человеку лабу. Задание: "Разработать программу «переворота» строки. Способ: последовательная перестановка элементов - первый с последним, второй с предпоследним и т.д." В решении необходимо использовать рекурсию. Так я пытался её решить:
C++
1
2
3
4
5
6
7
8
9
10
11
void turn(char c[], int step, int size)
{
    if(step < size>>1)
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2;
        c[size-step-1] = temp;
        turn(c,++step,size);
    }
}
На седьмой строке вылетает ошибка: "Необработанное исключение. Нарушения прав доступа." ну и адреса ещё. Пытался до этого передавать строку как char **c, char *&c, char (&c)[255] и ещё как то наверно, уже не помню. На сколько я знаю, в функцию всё равно передаётся указатель на char, так что я ума не приложу в чём дело. Подскажите, пожалуйста, почему ошибка и как сделать так, что бы строка изменялась в функции.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 18:52
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
#include <iostream>
using namespace std;
 
void turn(char *c, int step, int size)
{
    if(step < (size / 2))
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2;
        c[size-step-1] = temp;
        turn(c, ++step, size);
    }
}
 
int main()
{
    char str[] = "ABSDEFGHJ";
    cout << str << endl;
    turn(str, 0, strlen(str));
    cout << str << endl;
    
    system("pause");
    return 0;
}
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
29.08.2012, 20: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
#include <iostream>
#include <algorithm>
 
int len; //длина строки, чтобы не вычислять ее много раз
 
void turn (char c[], int pos)
{
    if (pos >= len/2)
        return;
    std::swap (c[pos], c[len-pos-1]);
    turn (c, pos+1);
}
 
int main()
{
    char c[100];
    std:: cin >> c;
    len = strlen(c);
    turn (c, 0);
    std:: cout << c << std::endl;
    system ("pause");
    return 0;
}
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
29.08.2012, 20:07
Цитата Сообщение от ALL_ZZ Посмотреть сообщение
На седьмой строке вылетает ошибка
- проверь, не передаешь ли ты своей функции указатель на константу.

C++
1
2
3
4
5
6
7
8
9
    // так - будет исключение
 
    char *str = "ABSDEFGHJ";
    turn(str, 0, strlen(str));
 
    // а так - не будет
 
    char str[] = "ABSDEFGHJ";
    turn(str, 0, strlen(str));
1
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 20:14
alsav22, Спасибо Ваш код работает) Народ, проблема решена, извините что раньше не написал, форум кажется глючил.
Теперь обнаружилась интересная закономерность: Так всё работает
C++
1
2
3
4
5
6
7
char str[] = "ABSDEFGHJ";
    cout << str << endl;
    turn(str, 0, strlen(str));
    cout << str << endl;
    
    system("pause");
    return 0;
Если же я пытаюсь инициализировать строку так
C++
1
char str[] = "";scanf("%s", &str);
по завершении программы (уже после return), выпадает ошибка: "Stack around variable 'str' was corrupted". почему так?
З.Ы.: Пользуюсь Visual Studio 2010 express
0
 Аватар для Intel~lect
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
29.08.2012, 20:27
Цитата Сообщение от ALL_ZZ Посмотреть сообщение
Если же я пытаюсь инициализировать строку так
char str[] = "";scanf("%s", &str);
по завершении программы (уже после return), выпадает ошибка: "Stack around variable 'str' was corrupted"
Укажи максимальный размер строки:
C++
1
char str[30] = "";scanf("%s", &str)
1
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 20:49
Цитата Сообщение от Intel~lect Посмотреть сообщение
Укажи максимальный размер строки:
C++
1
char str[30] = "";scanf("%s", &str)
Спасибо. А почему так?
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
29.08.2012, 20:52
ALL_ZZ, вы выделяете память точно так же, как и массив. Если такая конструкция char c[] = "123456"; , то строка инициализируется сразу и ее длина - длина строки 123456, если же строка вводится, заранее не известно какова длина ввода и поэтому надо заранее определить максимальную длину.
2
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:06
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, вы выделяете память точно так же, как и массив. Если такая конструкция char c[] = "123456"; , то строка инициализируется сразу и ее длина - длина строки 123456, если же строка вводится, заранее не известно какова длина ввода и поэтому надо заранее определить максимальную длину.
Это вроде как понятно, но программа же работает. Всё корректно переворачивается и выводится на консоль и лишь в конце программы вылетает ошибка.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
29.08.2012, 21:08
ALL_ZZ, покажите весь код
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 21:25
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, покажите весь код
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
#include <iostream>
using namespace std;
 
void turn(char *c, int step, int size)
{
    if(step < (size / 2))
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2;
        c[size-step-1] = temp;
        turn(c, ++step, size);
    }
}
 
int main()
{
    char str[] = "";
    cin >> str;
    
    cout << str << endl;
    turn(str, 0, strlen(str));
    cout << str << endl;
    
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:28
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, покажите весь код
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
// Lab3.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h";
 
void turn(char *c, int step, int size)
{
    if(step < size>>1)
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2;
        c[size-step-1] = temp;
        turn(c,++step,size);
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    printf("%s","Please, type string: ");
    char test[] = "sdfgber";
    scanf("%s", &test);
    int step = 0;
    turn(test,step,strlen(test));
    printf("%s",test);
    scanf("%d",&step);
    return 0;
}
когда я ввожу с консоли строку длиной большей, чем длина строки "sdfgber", то выпадает ошибка, когда меньшей - ошибки нет, т.е. действительно, зависит от размера выделяемой памяти. Просто интересно, почему тогда в строку длины 7 (в данном случае) я могу записать более длинную строку и даже провести над ней некоторые операции, но в конце программы вылезет ошибка)
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
29.08.2012, 21:34
ALL_ZZ, из-за этой строки
C++
1
char test[] = "sdfgber";
длина строки test становится равной 7. И поэтому, если ввести строку длиной больше семи, обращение к неверному индексу. если же написать так
C++
1
char test[100];
то можно будет вводить строки длиной 100.
Поймите, если так написать:
C++
1
char test[] = "здесь_строка"
это будет тоже самое, как и
C++
1
char test[длина_строки] = "здесь_эта_строка";
1
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:37
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, из-за этой строки
C++
1
char test[] = "sdfgber";
длина строки test становится равной 7. И поэтому, если ввести строку длиной больше семи, обращение к неверному индексу. если же написать так
C++
1
char test[100];
то можно будет вводить строки длиной 100.
Поймите, если так написать:
C++
1
char test[] = "здесь_строка"
это будет тоже самое, как и
C++
1
char test[длина_строки] = "здесь_эта_строка";
Да я так и думал, я же написал об этом. Но программа тем не менее выполняется, даже если я запишу туда строку длинее 7ми символов. Ошибка возникает только в конце. Вообщем, не заморачивайтесь, вы и так мне помогли)
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
29.08.2012, 21:44
ALL_ZZ, такой код у меня работает
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
#include <iostream>
#include <cstring>
 
void turn(char *c, int step, int size)
{
    if(step < size>>1)
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2;
        c[size-step-1] = temp;
        turn(c,++step,size);
    }
}
 
int main()
{
    std:: cout << "Please, type string: " ;
    char test[100] = "";
    std:: cin >> test;
    int step = 0;
    turn(test,step,strlen(test));
    
    std:: cout << test << std::endl;
    system ("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:55
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, такой код у меня работает
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
#include <iostream>
#include <cstring>
 
void turn(char *c, int step, int size)
{
    if(step < size>>1)
    {
        char temp = c[step];
        char temp2 = c[size-step-1];
        c[step] = temp2;
        c[size-step-1] = temp;
        turn(c,++step,size);
    }
}
 
int main()
{
    std:: cout << "Please, type string: " ;
    char test[100] = "";
    std:: cin >> test;
    int step = 0;
    turn(test,step,strlen(test));
    
    std:: cout << test << std::endl;
    system ("pause");
    return 0;
}
Рад за вас) Не понимаю, что вы хотели этим сказать, я ведь не спорил с вами. Я к тому же (как вы наверно заметили) не пользуюсь iostream, потому что в лабах нельзя им пользоваться вроде бы.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 22:00
Цитата Сообщение от Dani Посмотреть сообщение
И поэтому, если ввести строку длиной больше семи, обращение к неверному индексу
В какой строке кода? Вопрос в том, почему ошибка возникает не при работе функции turn(), а когда функция уже отработала, выведен результат работы на консоль, и выполняется выход из main() ?
Миниатюры
Переворот строки. Необработанное исключение. Нарушения прав доступа  
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
29.08.2012, 22:02
alsav22, может это невидно отладкой, но все-же не так. На вашем скрине длина строки вообще 0, а вы туда еще запихнуть хотите что-то.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2012, 22:02
Помогаю со студенческими работами здесь

Необработанное исключение. Нарушение прав доступа при чтении
Ребят помогите. В общем есть программа, открывает один файл, ищет в нем последовательности, заменяет на другие. В консоли все прекрасно...

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше своих соседей. Дело в том,что функция...

Необработанное исключение по адресу 0x00E730CD в ConsoleApplication18.exe: 0xC0000005: нарушение прав доступа при чтении
Задана целочисленная динамическая матрица M. Элементы этой матрицы, без остатка делящиеся на 6, переписать в динамический массив L и найти...

Необработанное исключение по адресу 0x0FF3C6BC (ucrtbased.dll) в lab4.exe: 0xC0000005: нарушение прав доступа при запис
// Дана ведомость абитуриентов. В каждой строке записана фамилия абитуриента, // средний балл аттестата. Определить средний балл...

Необработанное исключение: "Нарушение прав доступа при записи"
Подскажите в чём проблемма происходит ошибка при выполнение программы #include &lt;iostream&gt; #include &lt;string&gt; using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru