Почему эта простая программа выдает ошибку сегментации? - PullRequest
1 голос
/ 16 марта 2011

Я написал простую программу на C ++. Идея состоит в том, что когда он видит не алфавитный символ, то до тех пор, пока он не увидит новое слово (пробел) или строку не закончится, он продолжает увеличивать итератор.

Это порождает ошибку сегментации, не знаю почему :( Пожалуйста, помогите.

#include <iostream>
using namespace std;

int main()
{
 string str("Hello yuio");
 string::iterator it=str.begin();

 while(it!=str.end())
 {
  cout << *it << endl;

  if(isalpha(*it)==0){
   cout << *it << ":Is not an alphabet\n";

   while((*it!=' ')||(it!=str.end()))
   {
     cout << *it << endl;
     it++;
   }
  }

if(it!=str.end()){it++;}
  } // while loop ends
}  // End of main

Ответы [ 3 ]

11 голосов
/ 16 марта 2011
while((*it!=' ')||(it!=str.end()))

*it оценивается перед проверкой, можно ли использовать it. Изменить на:

while((it!=str.end())&&(*it!=' '))
5 голосов
/ 16 марта 2011
while((*it!=' ')||(it!=str.end()))

В строке выше содержатся две ошибки.

  1. Условие говорит, что цикл должен продолжаться, пока текущий символ не является пробелом ИЛИ конецСтрока еще не достигнута.Т.е., даже когда достигнут конец, но текущий символ не является пробелом, цикл продолжится.

  2. Как только вы исправите эту ошибку (заменив || на &&),вы все еще пытаетесь разыменовать конечный итератор (потому что проверка на пробел наступает перед проверкой конца строки), что недопустимо.Вы должны изменить порядок условий:

    while((it!=str.end()) && (*it!=' '))

2 голосов
/ 16 марта 2011

Проблема здесь:

while((*it!=' ')||(it!=str.end()))

Когда вы достигнете конца строки, первая часть условия будет истинной, и вы продолжите цикл и увеличивать итератор.Вам нужно заменить на &&:

while((*it!=' ')&&(it!=str.end()))
...