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

发布于 2024-10-23 23:03:50 字数 564 浏览 1 评论 0原文

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

I have written a simple C++ program. The idea is, once it sees a non-alphabetic character, then till the time it see a new word (a blank) or the string ends, it keeps on incrementing the iterator.

This generates Segmentation fault, no idea why :(
Please help.

#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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

年华零落成诗 2024-10-30 23:03:50
while((*it!=' ')||(it!=str.end()))

*it 在检查 it 本身是否可以使用之前进行评估。更改为:

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

*it is evaluated before checking if it itself is ok to use. Change to:

while((it!=str.end())&&(*it!=' '))
差↓一点笑了 2024-10-30 23:03:50
while((*it!=' ')||(it!=str.end()))

上面的行包含两个错误。

  1. 条件表示当前字符不是空格尚未到达字符串末尾时循环应继续。即,即使到达末尾但当前字符不是空格,循环也会继续。

  2. 一旦修复了此错误(通过将 || 替换为 &&),您仍然会尝试取消引用结束迭代器(因为空间检查来自 <在检查字符串结尾之前),这是不允许的。您必须切换条件的顺序:

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

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

The line above contains two errors.

  1. The condition says that the loop shall go on while the current character is not a space OR end of string is not reached yet. I.e., even when the end is reached but current char is not a space, the loop will proceed.

  2. Once you fixed this error (by replacing || with &&), you still try to dereference the end iterator (because the check for space comes before the check for end of string), which is not allowed. You have to switch the order of conditions:

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

唯憾梦倾城 2024-10-30 23:03:50

问题就在这里:

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

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

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

The problem is here:

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

When you reach the end of the string, the first part of the condition is true and so you continue looping and incrementing the iterator.
You need to replace with &&:

while((*it!=' ')&&(it!=str.end()))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文