可能是什么问题?我认为可能是在使用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) ;
}
答案 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年之后,我没有这样的错误。