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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
KostyaKulakov
Заблокирован
29.08.2012, 14:24     Переворот строки. Необработанное исключение. Нарушения прав доступа #1
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++
Нарушения прав доступа при чтении C++
C++ Необработанное исключение. Нарушение прав доступа при чтении
C++ Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC
C++ Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 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
5282 / 4801 / 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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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
Модератор
 Аватар для Catstail
21503 / 10256 / 1670
Регистрация: 12.02.2012
Сообщений: 17,143
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
 Аватар для 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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 21:08     Переворот строки. Необработанное исключение. Нарушения прав доступа #12
ALL_ZZ, покажите весь код
alsav22
5282 / 4801 / 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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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
5282 / 4801 / 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++
C++ Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу
Необработанное исключение по адресу, нарушение прав доступа при записи по адресу C++

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

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

Текущее время: 06:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru