Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:27  [ТС]     Ошибка в цикле while #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Diezel2012, сделайте, как я написал, тогда программу не выкидывает и будем дальше разбираться.
Так ее тоже выкидывает. В написали условие - если после после пробела идет конец строки тогда завершить. Напомню мне необходимо условие что если после символа следует пробел или конец строки (если это последнее слово в строке) тогда прекратить наращивать счетчик
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:33     Ошибка в цикле while #22
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Так ее тоже выкидывает.
В этом коде выкидывает?
Код
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
108
#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;
    system("pause");
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 + 1]!='\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";
                                    }
                }
        }
}


Добавлено через 3 минуты
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Напомню мне необходимо условие что если после символа следует пробел или конец строки (если это последнее слово в строке) тогда прекратить наращивать счетчик
Так и работает. Поставьте точку остановки и посмотрите сами.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:33  [ТС]     Ошибка в цикле while #23
Цитата Сообщение от Elboy Посмотреть сообщение
По вашему элемент s[-1] объявлен?
В 34 строке такое же условие (функция change) все прекрасно работает. Ну посмотрит программа в ячейку str[-1](если это первое слово), увидит там какую-нибудь муру и оперативки типа 487484151564 - оно ж все равно не будет равно пробелу или его коду в ascii и условие нормально выполнится тут причина сокрыта где-то в другом месте.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:38     Ошибка в цикле while #24
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Вы написали условие - если после пробела идет конец строки тогда завершить.
Смотрите внимательнее. Остановка будет при любом из двух условий: если пробел или если следующий символ конец строки.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:38  [ТС]     Ошибка в цикле while #25
Цитата Сообщение от alsav22 Посмотреть сообщение
В этом коде выкидывает?
Код
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
108
#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;
    system("pause");
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 + 1]!='\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";
                                    }
                }
        }
}


Добавлено через 3 минуты

Так и работает. Поставьте точку остановки и посмотрите сами.
Да большое спасибо действительно работает корректно,теперь пойду смотреть что там дальше не так.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:39     Ошибка в цикле while #26
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Да большое спасибо действительно работает корректно,теперь пойду смотреть что там дальше не так.
Для начала посмотрите, та ли используется позиция последнего символа. Она равна p - 1, кроме последнего слова с строке, там - p.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:42  [ТС]     Ошибка в цикле while #27
Цитата Сообщение от alsav22 Посмотреть сообщение
Для начала посмотрите, та ли используется позиция последнего символа. Она равна p - 1.
Да это я видел просто еще не исправлял, благодарю за оказанную помощь.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 03:30     Ошибка в цикле while #28
Цитата Сообщение от Elboy Посмотреть сообщение
Всё известно. Пока символ не равен пробелу или концу строки, то переходим к след символу. А ваше предложение ничего не изменит.
При || выход из цикла будет если оба условия не выполнятся, т.е. str[p] должен одновременно стать равен и ' ' и '\0'. И как по вашему, где это произойдёт?

Добавлено через 24 минуты
Добавлю. Diezel2012, вы эту строчку лучше так напишите:
C++
1
while(str1[p + 1]!=' '&& str1[p + 1]!='\0')p++;
Тогда позиция последнего символа в слове будет равна p, и не будет другой для последнего символа последнего слова в строке.

Добавлено через 8 минут
Еще. Там, где объявляете bool flag;, присвойте ему значение, а то при переходе к третьему if, минуя второй, будет обращение к неинициализированной переменной.

Добавлено через 5 минут
Сделал, как посоветовал и код, в общем-то, заработал.
Миниатюры
Ошибка в цикле while  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 04:05     Ошибка в цикле while
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 04:05     Ошибка в цикле while #29
Но в коде есть баг. Полиндромы определяются только до обычного слова.

Добавлено через 19 минут
Понял. В начале for() нужно устанавливать flag = true.
Код
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
void polindrom(char *str1)
{
    int p;
    bool flag;
    for(int i=0; str1[i]!='\0'; i++)
    {
        flag = true;
        p=i;
        if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
        {
            while(str1[p + 1]!=' '&& str1[p + 1]!='\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";
              }
         } 
    } 
}
Yandex
Объявления
09.09.2012, 04:05     Ошибка в цикле while
Ответ Создать тему
Опции темы

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