迭代器分段故障c ++

时间:2017-05-11 12:44:03

标签: c++ c++11 vector iterator segmentation-fault

我写了一个简单的算法来显示第n个素数。简单地说,它使用找到素数的向量来检查下一个数字是否也是素数;如果是,则将其推入向量并重复直到找到第n个素数。

不幸的是,我在嵌套在while循环中的for循环中遇到了分段错误,我不知道为什么。更具体地说,错误发生在for循环的标题中;我在for循环的主体中添加了一个cerr << "Check " << z++ << endl;(并在它之前添加了一个)以查看它发生的位置,所以我认为错误与迭代器有关。

该程序非常小,我不介意分享它(如果你有使用它的话),所以这就是全部:

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
#include <vector>

using std::cout;
using std::cerr;
using std::endl;
using std::vector;

int main( int argc, char* argv[] )
{
    if( argc != 2 )
    {
        cerr << "USAGE: nthPrime n" << endl;
        return 1;
    }

    vector< unsigned > primes;
    vector< unsigned >::iterator it;
    bool isPrime;
    char *sffx = ( char ) 0;
    unsigned n = atoi( argv[ 1 ] ),
             x = 3,
             max;

    primes.push_back( 2 );

    while( primes.size() != n )
    {
        isPrime = true;
        max = ( unsigned )sqrt( x );

        for( it = primes.begin(); *it <= max; ++it )
            if( !( x % *it ) ) isPrime = false;

        if( isPrime ) primes.push_back( x );
        x += 2;
    }

    if( n == 1 ) strcpy( sffx, "st" );
    else if( n == 2 ) strcpy( sffx, "nd" );
    else if( n == 3 ) strcpy( sffx, "rd" );
    else strcpy( sffx, "th" );

    cout << "The " << n << sffx << " prime is " << primes.back() << endl;

    return 0;
}

这里的makefile也是为了方便:

CCFLAGS = -Wall -std=c++11

nthPrime: nthPrime.o
    g++ $(CCFLAGS) -o nthPrime nthPrime.o

nthPrime.o: nthPrime.cpp
    g++ $(CCFLAGS) -c nthPrime.cpp

clean:
    -rm *.o nthPrime

我忽略了一小时前我刚刚写完的任何评论,所以如果你愿意,请告诉我。

提前致谢。

P.S。我已尝试将&& it != primes.end()添加到for循环中,但由于算法的属性而无法提供,但它无论如何都没有帮助。

2 个答案:

答案 0 :(得分:2)

我可以看到一些问题:

1)使用argv而不检查

unsigned n = atoi( argv[ 1 ] ),
             x = 3,
             max;

2)这个:

char *sffx = ( char ) 0;

不为此分配空间:

if( n == 1 ) strcpy( sffx, "st" );
else if( n == 2 ) strcpy( sffx, "nd" );
else if( n == 3 ) strcpy( sffx, "rd" );
else strcpy( sffx, "th" );

答案 1 :(得分:0)

好的,谢谢大家这么快回复我!我以为我会等一整天!该问题原来是char *sffx = ( char ) 0;行。将其更改为char *sffx = new char[ 3 ];修复所有内容。

对于任何可能因任何原因而最终遇到类似问题或只是想要该计划的人,请点击此处:

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
#include <vector>

using std::cout;
using std::cerr;
using std::endl;
using std::vector;

int main( int argc, char* argv[] )
{

    vector< unsigned > primes;
    vector< unsigned >::iterator it;
    bool isPrime;
    char *sffx = new char[ 3 ];
    unsigned n = atoi( argv[ 1 ] ),
             x = 3,
             max;

    if( argc != 2 || n < 1)
    {
        cerr << "USAGE: nthPrime n>0" << endl;
        return 1;
    }

    primes.push_back( 2 );

    while( primes.size() < n )
    {
        isPrime = true;
        max = ( unsigned )sqrt( x );

        for( it = primes.begin(); *it <= max; ++it )
            if( !( x % *it ) ) isPrime = false;

        if( isPrime ) primes.push_back( x );
        x += 2;
    }

    if( n % 10 == 1 && n % 100 != 11 ) strcpy( sffx, "st" );
    else if( n % 10 == 2 && n % 100 != 12 ) strcpy( sffx, "nd" );
    else if( n % 10 == 3 && n % 100 != 13 ) strcpy( sffx, "rd" );
    else strcpy( sffx, "th" );

    cout << "The " << n << sffx << " prime is " << primes.back() << endl;

    return 0;
}

再次感谢大家!

P.S。第86626号素数是一个很酷的素数我只是随机进行测试,以高价值测试程序;看看吧!