获得:" STATUS_ACCESS_VIOLATION"在尝试编译此C ++代码时

时间:2015-03-12 15:38:16

标签: c++

可能是什么问题?我认为可能是在使用strtok时初始化指针,但这并没有解决问题。对不起,如果这是愚蠢的,我对此很新。

这是我的代码:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iomanip>
using namespace std ;

int main() {

//initialize and get input into a string, turn into a cstring
    string intstring ;  
    cout << "Enter five integers: " ;
    cin >> intstring ;
    char * cstr = new char [intstring.length()+1];
    strcpy (cstr, intstring.c_str());

//use strtok to convert into an array of strings
    int intarray[5] ;
    char * point = strtok ( cstr , " " ) ;;
    int i = 0 ;
    while ( point != NULL ) {
        intarray[i] = atoi ( point ) ;
        point = strtok ( cstr , " " ) ;
        i++ ;
        }

//get the sum of all integers
int sum = 0;
    for (int i = 0; i < 5 , i++ ;) {
        sum += intarray[i] ;    
    }   

//sort the array of integers
sort(intarray, (intarray + 5)) ;

//print the mean and median
    cout <<  "Median is " << intarray[2] << endl;
    cout << "Geometric mean is " ;
    cout << (sum / 5) << setprecision(4);

    return (0) ;
    }

3 个答案:

答案 0 :(得分:1)

这两个错误是:

  • cin >> intstring只读取第一个数字,在找到空格时停止。您希望getline(cin, intstring)读取整行
  • 只有第一次调用strtok才能传递cstr作为参数。后续调用应通过NULL以继续上次呼叫结束的位置。你继续读取第一个值,直到i越界并导致崩溃(或其他未定义的行为)。

但是,由于这是C ++而不是C,所以实际上不需要strtok。从输入中读取五个数字的简单方法是

for (size_t i = 0; i < 5; ++i) {
    cin >> intarray[i];
}

答案 1 :(得分:0)

我可以在没有任何警告或错误的情况下编译代码(Microsoft Visual Studio 2010 Prof.)。但是,您在代码中有一些错误:

string intstring ;  
cout << "Enter five integers: " ;
cin >> intstring ;

您将cn中的一个号码拉入字符串,其余的将被忽略。使用其他分隔符,例如&#39;,&#39;,然后使用此分隔符执行拆分操作或采取其他方法:

int intarray[5] ;

for (int i = 0; i < 5; ++i) {
    cin >> intarray[i];
}

此外, strtok 以另一种方式使用(后续调用必须使用NULL作为第一个参数):

char * point = strtok ( cstr , " " );
int i = 0 ;
while ( point != NULL ) {
    intarray[i] = atoi ( point );
    point = strtok ( NULL , "," ); // Pass NULL as first argument
    i++;
}

如果循环继续并尝试访问,例如 intarray

的第6个元素,请确保您不会遇到缓冲区溢出

答案 2 :(得分:0)

您的错误“STATUS_ACCESS_VIOLATION”不是代码错误。如果代码不正确,那么您将获得“语法错误”或“未知关键字”等。这是编译器本身的异常错误。

当我使用2010命令行编译器(使用mingw处理make文件)编译我的x64项目时,我遇到了同样的错误。在我切换到2015年之后,我没有这样的错误。