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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
KostyaKulakov
Заблокирован
#1

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

29.08.2012, 14:24. Просмотров 1381. Ответов 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);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2012, 14:24     Переворот строки. Необработанное исключение. Нарушения прав доступа
Посмотрите здесь:

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

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

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

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

Нарушения прав доступа при чтении - C++
Добрый день. Возникла проблема: Во время отладки программы возникает ошибка: http://s018.***********/i523/1303/ee/b424aef51e14.png ...

Нарушения прав доступа при чтении - C++
Всем доброй ночи! Пишу курсовую и появилась проблема: нарушения прав доступа при чтении. Проверил отладчиком и нашел где ошибка, но в чем...

Нарушения прав доступа при записи(не в файл). - C++
Вот такая проблемка есть: char* ret=&quot;&quot;; __asm { lea esi,ret; mov eax,0x34; inc esi; mov ret,eax };

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
87 / 739 / 75
Регистрация: 11.04.2012
Сообщений: 971
29.08.2012, 14:28     Переворот строки. Необработанное исключение. Нарушения прав доступа #2
C++
1
2
    char str[256] = "hello";
    turn(str,0,strlen(str));
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 17:39     Переворот строки. Необработанное исключение. Нарушения прав доступа #3
Здравствуйте. Назрел глупый вопрос, с которым мучаюсь несколько часов. Пишу одному человеку лабу. Задание: "Разработать программу «переворота» строки. Способ: последовательная перестановка элементов - первый с последним, второй с предпоследним и т.д." В решении необходимо использовать рекурсию. Так я пытался её решить:
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, так что я ума не приложу в чём дело. Подскажите, пожалуйста, почему ошибка и как сделать так, что бы строка изменялась в функции.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 18:52     Переворот строки. Необработанное исключение. Нарушения прав доступа #4
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;
}
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 20:03     Переворот строки. Необработанное исключение. Нарушения прав доступа #5
Мое решение
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;
}
Catstail
Модератор
22452 / 10857 / 1769
Регистрация: 12.02.2012
Сообщений: 17,976
29.08.2012, 20:07     Переворот строки. Необработанное исключение. Нарушения прав доступа #6
Цитата Сообщение от 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));
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 20:14     Переворот строки. Необработанное исключение. Нарушения прав доступа #7
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
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
29.08.2012, 20:27     Переворот строки. Необработанное исключение. Нарушения прав доступа #8
Цитата Сообщение от ALL_ZZ Посмотреть сообщение
Если же я пытаюсь инициализировать строку так
char str[] = "";scanf("%s", &str);
по завершении программы (уже после return), выпадает ошибка: "Stack around variable 'str' was corrupted"
Укажи максимальный размер строки:
C++
1
char str[30] = "";scanf("%s", &str)
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 20:49     Переворот строки. Необработанное исключение. Нарушения прав доступа #9
Цитата Сообщение от Intel~lect Посмотреть сообщение
Укажи максимальный размер строки:
C++
1
char str[30] = "";scanf("%s", &str)
Спасибо. А почему так?
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 20:52     Переворот строки. Необработанное исключение. Нарушения прав доступа #10
ALL_ZZ, вы выделяете память точно так же, как и массив. Если такая конструкция char c[] = "123456"; , то строка инициализируется сразу и ее длина - длина строки 123456, если же строка вводится, заранее не известно какова длина ввода и поэтому надо заранее определить максимальную длину.
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:06     Переворот строки. Необработанное исключение. Нарушения прав доступа #11
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, вы выделяете память точно так же, как и массив. Если такая конструкция char c[] = "123456"; , то строка инициализируется сразу и ее длина - длина строки 123456, если же строка вводится, заранее не известно какова длина ввода и поэтому надо заранее определить максимальную длину.
Это вроде как понятно, но программа же работает. Всё корректно переворачивается и выводится на консоль и лишь в конце программы вылетает ошибка.
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 21:08     Переворот строки. Необработанное исключение. Нарушения прав доступа #12
ALL_ZZ, покажите весь код
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 21:25     Переворот строки. Необработанное исключение. Нарушения прав доступа #13
Цитата Сообщение от 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;
}
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:28     Переворот строки. Необработанное исключение. Нарушения прав доступа #14
Цитата Сообщение от 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 (в данном случае) я могу записать более длинную строку и даже провести над ней некоторые операции, но в конце программы вылезет ошибка)
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 21:34     Переворот строки. Необработанное исключение. Нарушения прав доступа #15
ALL_ZZ, из-за этой строки
C++
1
char test[] = "sdfgber";
длина строки test становится равной 7. И поэтому, если ввести строку длиной больше семи, обращение к неверному индексу. если же написать так
C++
1
char test[100];
то можно будет вводить строки длиной 100.
Поймите, если так написать:
C++
1
char test[] = "здесь_строка"
это будет тоже самое, как и
C++
1
char test[длина_строки] = "здесь_эта_строка";
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:37     Переворот строки. Необработанное исключение. Нарушения прав доступа #16
Цитата Сообщение от 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ми символов. Ошибка возникает только в конце. Вообщем, не заморачивайтесь, вы и так мне помогли)
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 21:44     Переворот строки. Необработанное исключение. Нарушения прав доступа #17
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;
}
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:55     Переворот строки. Необработанное исключение. Нарушения прав доступа #18
Цитата Сообщение от 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, потому что в лабах нельзя им пользоваться вроде бы.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 22:00     Переворот строки. Необработанное исключение. Нарушения прав доступа #19
Цитата Сообщение от Dani Посмотреть сообщение
И поэтому, если ввести строку длиной больше семи, обращение к неверному индексу
В какой строке кода? Вопрос в том, почему ошибка возникает не при работе функции turn(), а когда функция уже отработала, выведен результат работы на консоль, и выполняется выход из main() ?
Миниатюры
Переворот строки. Необработанное исключение. Нарушения прав доступа  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 22:02     Переворот строки. Необработанное исключение. Нарушения прав доступа
Еще ссылки по теме:

Нарушения прав доступа к чтению (работа с файлами) - C++
Пробую реализовать запись в файл: #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; ...

Ошибка нарушения прав доступа при выполнении программы - C++
Програмка компилируется, но не запускается. Ошибка: 1000 (0) handle_exceptions: Exception: STATUS_ACCESS_VIOLATION preo 1000 (0)...

Необработанное исключение по адресу (msvcp110d.dll): нарушение прав досупа при записи - C++
Доброго времени суток. Надеюсь на вашу помощь в решении моей проблемы. Я имею две функции, первая считывает и перезаписывает в бинарном...

Исключение Нарушение прав доступа при чтении - C++
Есть такое задание - создать 2 класса Класс -символ, c печататью свое знач и ответом на запрос о значении своего символьного поля; ...

При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему? - C++
Структура Test описана в классе ABC: class ABC{ struct Test { int get_i() { return i; } void put_i(int j) { i = j;} ...


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

Или воспользуйтесь поиском по форуму:
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 22:02     Переворот строки. Необработанное исключение. Нарушения прав доступа #20
alsav22, может это невидно отладкой, но все-же не так. На вашем скрине длина строки вообще 0, а вы туда еще запихнуть хотите что-то.
Yandex
Объявления
29.08.2012, 22:02     Переворот строки. Необработанное исключение. Нарушения прав доступа
Ответ Создать тему
Опции темы

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