Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
KostyaKulakov
Заблокирован
1

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

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

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

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

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

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

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

29
zitxbit
89 / 741 / 279
Регистрация: 11.04.2012
Сообщений: 971
29.08.2012, 14:28 2
C++
1
2
    char str[256] = "hello";
    turn(str,0,strlen(str));
0
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, так что я ума не приложу в чём дело. Подскажите, пожалуйста, почему ошибка и как сделать так, что бы строка изменялась в функции.
0
alsav22
5442 / 4837 / 831
Регистрация: 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;
}
1
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 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;
}
1
Catstail
Модератор
23603 / 11704 / 2046
Регистрация: 12.02.2012
Сообщений: 19,094
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));
1
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
0
Intel~lect
135 / 124 / 14
Регистрация: 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)
1
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)
Спасибо. А почему так?
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 20:52 10
ALL_ZZ, вы выделяете память точно так же, как и массив. Если такая конструкция char c[] = "123456"; , то строка инициализируется сразу и ее длина - длина строки 123456, если же строка вводится, заранее не известно какова длина ввода и поэтому надо заранее определить максимальную длину.
2
ALL_ZZ
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 47
29.08.2012, 21:06 11
Цитата Сообщение от Dani Посмотреть сообщение
ALL_ZZ, вы выделяете память точно так же, как и массив. Если такая конструкция char c[] = "123456"; , то строка инициализируется сразу и ее длина - длина строки 123456, если же строка вводится, заранее не известно какова длина ввода и поэтому надо заранее определить максимальную длину.
Это вроде как понятно, но программа же работает. Всё корректно переворачивается и выводится на консоль и лишь в конце программы вылетает ошибка.
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 21:08 12
ALL_ZZ, покажите весь код
0
alsav22
5442 / 4837 / 831
Регистрация: 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;
}
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 (в данном случае) я могу записать более длинную строку и даже провести над ней некоторые операции, но в конце программы вылезет ошибка)
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 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[длина_строки] = "здесь_эта_строка";
1
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ми символов. Ошибка возникает только в конце. Вообщем, не заморачивайтесь, вы и так мне помогли)
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 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;
}
1
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, потому что в лабах нельзя им пользоваться вроде бы.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 22:00 19
Цитата Сообщение от Dani Посмотреть сообщение
И поэтому, если ввести строку длиной больше семи, обращение к неверному индексу
В какой строке кода? Вопрос в том, почему ошибка возникает не при работе функции turn(), а когда функция уже отработала, выведен результат работы на консоль, и выполняется выход из main() ?
1
Миниатюры
Переворот строки. Необработанное исключение. Нарушения прав доступа  
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 22:02 20
alsav22, может это невидно отладкой, но все-же не так. На вашем скрине длина строки вообще 0, а вы туда еще запихнуть хотите что-то.
1
29.08.2012, 22:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 22:02

Необработанное исключение по адресу, нарушение прав доступа при записи по адресу
вот само задание: Авиарейсы (номер рейса, пункт назначения, время вылета, дата...

Необработанное исключение: "Нарушение прав доступа при чтении"
При выполнении тестов {input...output} появляется необработанное исключение по...

Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу
Помогите, пожалуйста, исправит ошибку. Необработанное исключение по адресу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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