为什么这个简单的程序会出现分段错误?

时间:2011-03-16 08:21:20

标签: c++ string segmentation-fault

我写了一个简单的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 个答案:

答案 0 :(得分:11)

while((*it!=' ')||(it!=str.end()))
在检查*it本身是否可以使用之前评估

it。改为:

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

答案 1 :(得分:5)

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

上面一行包含两个错误。

  1. 条件表示循环将继续,而当前字符不是空格 OR 尚未到达字符串的结尾。即,即使到达终点但当前的char不是空格,循环也会继续。

  2. 修复此错误后(将||替换为&&),您仍尝试取消引用结束迭代器(因为空格检查 之前检查字符串结尾),这是不允许的。你必须改变条件的顺序:

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

答案 2 :(得分:2)

问题在于:

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

当您到达字符串的末尾时,条件的第一部分为true,因此您继续循环并递增迭代器。 您需要替换为&&

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