C ++:错误C2065,C2131,遇到非恒定(子)表达式

时间:2018-09-15 17:05:04

标签: c++ c++11

我试图制作一个程序来获取用户的整数输入,然后将该int中的每个数字过滤为偶数和奇数。完成代码时没有任何错误,但是运行代码时会出错。

我的代码:

#include <iostream>
#include <string>
#include <array>
#include <stdio.h>
#include <cstring>
#include <sstream>
using namespace std;

int main() {
    int input = NULL;
    int EvenNumbering = 0;
    int OddNumbering = 0;

    cout << "Please input a number: ";
    cin >> input;

    string str = to_string(input); //Convert it to string
    char cstr[str.length];
    int EvenNo[str.length];
    int OddNo[str.length];

    strcpy(cstr , str.c_str()); //Put it into char array

    //Now filter Even number and Odd number
    for (string x : cstr) {
        int z = stoi(x);
        if (z % 2 == 0) {
            EvenNo[EvenNumbering] += z;
            EvenNumbering++;
        }
        else {
            OddNo[OddNumbering] += z;
            OddNumbering++;
        }
    }
    cout << endl;
    cout << "Even Numbers: ";

    for (int x : EvenNo) {
        cout << x << ", ";
    }

    cout << endl;
    cout << "Odd Numbers: ";

    for (int x : OddNo) {
        cout << x << ", ";
    }

    system("pause");
    return 0;
}

我的错误:

source.cpp(18): error C2131: expression did not evaluate to a constant
source.cpp(18): note: a non-constant (sub-)expression was encountered
source.cpp(19): error C2131: expression did not evaluate to a constant
source.cpp(19): note: a non-constant (sub-)expression was encountered
source.cpp(20): error C2131: expression did not evaluate to a constant
source.cpp(20): note: a non-constant (sub-)expression was encountered
source.cpp(26): error C2065: 'x': undeclared identifier
source.cpp(40): error C2065: 'x': undeclared identifier
source.cpp(47): error C2065: 'x': undeclared identifier
1>Done building project "Question.vcxproj" -- FAILED.

对C ++还是个新手,这是我的第一个项目,所以如果我犯了一些初学者的错误,请原谅我。

2 个答案:

答案 0 :(得分:0)

问题(一个问题)在这里:

string str = to_string(input); //Convert it to string
char cstr[str.length];
int EvenNo[str.length];
int OddNo[str.length];

str字符串在运行时进行了初始化,因此其长度无法在编译时得知。

但是str.lenght用于设置三个C样式数组的维度。

在C ++(标准版本)中,必须知道C样式数组的大小。

建议:对std::vectorcstrEvenNo使用OddNo

答案 1 :(得分:0)

这三行不是合法的C ++语法:

char cstr[str.length];
int EvenNo[str.length];
int OddNo[str.length];

要指出的第一个错误是length()函数是一个函数,而不是属性。因此语法为str.length()(注意括号表示函数调用)。

但是除此之外,C ++中的数组必须使用常量表达式声明,以表示条目数,而不是运行时派生的值。

在C ++中完成动态数组的方式(或最优选的方式)是使用std::vector

#include <vector>
//...
string str = to_string(input); //Convert it to string
std::vector<char> cstr(str.length());
std::vector<int> EvenNo(str.length());
std::vector<int> OddNo(str.length());

此外,确实不需要cstr。既然cstrvector<char>,那么下一行将导致失败:

strcpy(cstr , str.c_str()); //Put it into char array

由于cstr不再是char的数组,因此将不会(或不应)进行编译。解决此问题的方法是完全摆脱cstr,而在整个程序中都使用str

但是,如果您坚持保留std::vector<char>,则可以使用以下方法,但是实际上您应该摆脱cstr。但是这里:

strcpy(&cstr[0] , str.c_str()); //Put it into char array

如果cstr仍然是数组,则以下内容也可以工作。