【问题标题】:C++: Error C2065, C2131, a non-constant (sub-)expression was encountered [duplicate]C ++:错误C2065,C2131,遇到非常量(子)表达式[重复]
【发布时间】:2019-02-20 03:37:58
【问题描述】:

我试图制作一个程序来获取用户的整数输入,然后将该 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++ 还是新手,这是我的第一个项目,所以如果我犯了一些初学者的错误,请原谅我。

【问题讨论】:

  • 尝试使用std::vector 而不是 C 风格的数组。 (int name[size]) 它将为您节省很多问题。
  • char cstr[str.length]; -- 这不是合法的 C++。如果您想要一个动态数组,请使用std::vector&lt;char&gt;。此外,您使用的编译器会出现此错误,这是一件好事。太多的 C++ 新手使用允许这种语法的编译器品牌,因此他们最终认为自己编写的代码是有效的 C++。
  • 还有,为什么要使用cstr之类的char数组呢?只要坚持所有字符数据都是std::string。那么你就不需要不必要的strcpy了。
  • char cstr[str.length]int EvenNo[str.length];int OddNo[str.length]; 被称为“可变长度数组”(VLA)。它是一个 GCC 扩展。您需要找到 MSVC 等价物。您应该考虑改用std::vector

标签: c++ c++11


【解决方案1】:

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

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 样式数组的大小必须在编译时是已知的。

建议:cstrEvenNoOddNo 使用 std::vector

【讨论】:

    【解决方案2】:

    这三行不是合法的 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&lt;char&gt;

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

    由于cstr 不再是char 的数组,因此不会(或不应该)编译。解决它的方法是完全摆脱cstr,并在整个程序中使用str

    但是,如果你坚持保留std::vector&lt;char&gt;,那么下面的方法会起作用,但实际上你应该去掉cstr。但这里是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多