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

Ошибка в цикле while - C++

Восстановить пароль Регистрация
 
 
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 01:30     Ошибка в цикле while #1
Привет всем! Ниже приведен код программы, в программе две функции одна change() переводит Ф.И.О в формат фамилия - инициалы, а вторая polindrom() с которой собственно и проблема - ищет в введенной пользователем строке полиндромы и выводит их на экран. Программа создана в VS2010. Ошибок в данной программе компилятор не обнаруживает, но программа вылетает и отладчик указывает на то что в строке где определяется конец текущего слова (помечена комментарием) возникает бесконечный цикл и условие не срабатывает.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <windows.h>
 
using namespace std;
 
void change(char *str);
void polindrom(char *str1);
 
int main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char *str, *str1;
    str=new char[256];
    str1=new char[256];
    cout<<"Введите Ф.И.О\n";
    gets(str);
    change(str);
    puts(str);
    cout<<"Введите строку\n";
    gets(str1);
    polindrom(str1);
    delete[]str;
    delete[]str1;
return 0;
}
 
void change(char *str)
{
    int position=0, position1=0, s=0;
    for(int i=0; str[i]!='\0'; i++)
        {
            if((str[i]!=' '&&str[i-1]==' ')||(i==0))
                {
                    if((str[i]>='a'&&str[i]<='z')||(str[i]>='а'&&str[i]<='я'))str[i]=(int)str[i]-32;
                }
                else if((str[i]!=' '&&str[i-1]!=' ')||(i!=0))
                    {
                        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))str[i]=(int)str[i]+32;
                    }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=position; str[i]!='\0'; i++)
        {
            switch(s)
                {
                    case 1:
                    str[i]='.';
                    break;
 
                    case 2:
                    str[i]=str[position1];
                    break;
 
                    case 3:
                    str[i]='.';
                    break;
                }
            if(s>3)str[i]='\0';
            s++;
        }
}
 
void polindrom(char *str1)
{
    int p;
    bool flag;
    for(int i=0; str1[i]!='\0'; i++)
        {
            p=i;
            if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
                {
                    while(str1[p]!=' '||str1[p]!='\0')p++;//<-Проблема здесь (бесконечный цикл)
                        for(int j=i, k=0;j<=(p+i)/2;j++,k++)
                            {
                                if(str1[j]!=str1[p-k])flag=false;
                            }
                            if(flag==true)
                                {
                                    cout<<"Слово ";
                                        for(int j=i;j<=p;j++)
                                            {
                                                cout<<str1[j];
                                            }
                                        cout<<" - является полиндромом\n";
                                    }
                }
        }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 01:30     Ошибка в цикле while
Посмотрите здесь:

файлы в С (Ошибка в цикле) C++
Ошибка в цикле C++
C++ Ошибка в цикле
Ошибка в цикле C++
Ошибка в цикле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 01:47     Ошибка в цикле while #2
Наверное, вместо || нужно &&.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 01:51  [ТС]     Ошибка в цикле while #3
Нет тут условие или должен встетится пробел или конец строки, если поставить и то цикл будет тоже бесконечным т.к одновременно не может встрется конец строки и пробел.
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 01:51     Ошибка в цикле while #4
Ошибка в 90ой строке:
Цитата Сообщение от Diezel2012 Посмотреть сообщение
if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
при i=0 str[-1]
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 01:53     Ошибка в цикле while #5
Цитата Сообщение от Diezel2012 Посмотреть сообщение
while(str1[p]!=' '||str1[p]!='\0')p++;
Какая цель этой строки? Убрать пробелы?
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 01:54     Ошибка в цикле while #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Какая цель этой строки? Убрать пробелы?
Перескочить через пробелы или конец строки.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 01:56  [ТС]     Ошибка в цикле while #7
К сожалению там все правильно и условие работает ( определяет начало нового слова после пробела и новое слово в начале строке)
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 01:59     Ошибка в цикле while #8
При проверке этого условия программа обращается к неизвестному участку памяти, это в свою очередь может привести к непредсказуемому результату.

В строке с while у вас всё в порядке.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:02  [ТС]     Ошибка в цикле while #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Какая цель этой строки? Убрать пробелы?
Смысл следующий: от начала нового слова пройтись циклом и в переменную p запомнить позицию последнего символа в текущем слове

Добавлено через 2 минуты
Цитата Сообщение от Elboy Посмотреть сообщение
При проверке этого условия программа обращается к неизвестному участку памяти, это в свою очередь может привести к непредсказуемому результату.

В строке с while у вас всё в порядке.
Да только вот я не пойму почему так происходит
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.09.2012, 02:06     Ошибка в цикле while #10
с циклом понятно - он закончится, когда встретится пробел или нуль. или память доступная.
а что делает вся эта ф-я "полиндром"? вся ф-я - корявая до невозможности. ты сформулируй задачу, и тебе народ подскажет, какими средствами такие вещи решаются. не мудри, "все уже украдено до нас" (с)
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:07     Ошибка в цикле while #11
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Смысл следующий: от начала нового слова пройтись циклом и в переменную p запомнить позицию последнего символа в текущем слове

Добавлено через 2 минуты
Да только вот я не пойму почему так происходит
Я же вам сказал, почему так происходит: при i=0 s[-1]. Вам следует пересмотреть свой алгоритм.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:08  [ТС]     Ошибка в цикле while #12
Цитата Сообщение от novi4ok Посмотреть сообщение
с циклом понятно - он закончится, когда встретится пробел или нуль. или память доступная.
а что делает вся эта ф-я "полиндром"? вся ф-я - корявая до невозможности. ты сформулируй задачу, и тебе народ подскажет, какими средствами такие вещи решаются. не мудри, "все уже украдено до нас" (с)
палиндромом неформально называют любой симметричный относительно своей середины набор символов
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:09     Ошибка в цикле while #13
Цитата Сообщение от novi4ok Посмотреть сообщение
с циклом понятно - он закончится, когда встретится пробел или нуль. или память доступная.
а что делает вся эта ф-я "полиндром"? вся ф-я - корявая до невозможности. ты сформулируй задачу, и тебе народ подскажет, какими средствами такие вещи решаются. не мудри, "все уже украдено до нас" (с)
Задача сформирована корректна. Описана ошибка. А вот вы не по делу пишите.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:10     Ошибка в цикле while #14
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Смысл следующий: от начала нового слова пройтись циклом и в переменную p запомнить позицию последнего символа в текущем слове
Тогда так:
C++
1
while(str1[p] !=' ' && str1[p + 1] !='\0') p++;
Позиция последнего символа будет p - 1.
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:12     Ошибка в цикле while #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Тогда так:
C++
1
while(str1[p] !=' ' && str1[p + 1] !='\0') p++;
Господи, да не в этом дело. 100 раз уже было сказано в чём.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:18  [ТС]     Ошибка в цикле while #16
Цитата Сообщение от Elboy Посмотреть сообщение
Господи, да не в этом дело. 100 раз уже было сказано в чём.
Смотрите я прохожу отладчиком по все программе и ошибка обнаруживается именно в цикле - после прохода первого слова условие не срабатывает, а переменная p продолжает наращивать значения и где-то на 12000 программу выкидывает; Про память не совсем понятно ведь все элементы и массив объявлены и я нигде не выхожу за их пределы.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:20     Ошибка в цикле while #17
Цитата Сообщение от Diezel2012 Посмотреть сообщение
В строке с while у вас всё в порядке.
Где там порядок? У него цикл неизвестно куда уходит.

Добавлено через 1 минуту
Цитата Сообщение от Elboy Посмотреть сообщение
Господи, да не в этом дело. 100 раз уже было сказано в чём.
Для начала, именно в этом, дальше тоже могут быть ошибки, но нужно это правильно сдлать.
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:20     Ошибка в цикле while #18
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Смотрите я прохожу отладчиком по все программе и ошибка обнаруживается именно в цикле - после прохода первого слова условие не срабатывает, а переменная p продолжает наращивать значения и где-то на 12000 программу выкидывает; Про память не совсем понятно ведь все элементы и массив объявлены и я нигде не выхожу за их пределы.
По вашему элемент s[-1] объявлен?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:21     Ошибка в цикле while #19
Diezel2012, сделайте, как я написал, тогда программу не выкидывает и будем дальше разбираться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 02:24     Ошибка в цикле while
Еще ссылки по теме:

Ошибка в цикле C++
C++ Ошибка в цикле
C++ Ошибка в цикле while

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

Или воспользуйтесь поиском по форуму:
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:24     Ошибка в цикле while #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Где там порядок? У него цикл неизвестно куда уходит.
Всё известно. Пока символ не равен пробелу или концу строки, то переходим к след символу. А ваше предложение ничего не изменит.
Yandex
Объявления
09.09.2012, 02:24     Ошибка в цикле while
Ответ Создать тему
Опции темы

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