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

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

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

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

29.08.2012, 14:24. Просмотров 1448. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переворот строки. Необработанное исключение. Нарушения прав доступа (C++):

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

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

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

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

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

Необработанное исключение: "Нарушение прав доступа при чтении" - C++
При выполнении тестов {input...output} появляется необработанное исключение по адресу 0x009577E1 в 1590.exe: 0xC0000005: нарушение прав...

29
zitxbit
88 / 740 / 75
Регистрация: 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
5425 / 4820 / 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;
}
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 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
Модератор
22731 / 11100 / 1797
Регистрация: 12.02.2012
Сообщений: 18,297
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 / 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)
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 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 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 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
29.08.2012, 21:08 #12
ALL_ZZ, покажите весь код
0
alsav22
5425 / 4820 / 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;
}
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 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 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
29.08.2012, 21:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 21:34
Привет! Вот еще темы с ответами:

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

Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу - C++
Помогите, пожалуйста, исправит ошибку. Необработанное исключение по адресу 0x77D88E19 (ntdll.dll) в Lab11.exe: 0xC0000005: нарушение...

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09 - C++
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение прав доступа при чтении по адресу...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC - C++
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...


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

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

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