C++如何替代#define实现控制台输入数组大小?解决常量值错误
解决C++中用控制台输入替代#define定义数组大小的问题
嗨,这个问题我太熟了!你碰到的"expression must have constant value"错误,根源在于C++里静态数组的大小必须是编译期就能确定的常量。#define N 6是预编译阶段就替换成固定值的常量,完全符合要求,但你通过cin输入的numberofperson是程序运行时才会确定的变量,没法用来定义静态数组的大小。
下面给你两种实用的解决办法,都是C++里常用的方案:
方法1:使用动态数组(new/delete)
你可以用new关键字在运行时动态分配内存,这样就能根据输入的数值来创建对应大小的数组。不过要记得用完后用delete[]释放内存,避免内存泄漏。
修改后的代码示例:
#include <iostream> #include <string> #include <cstdlib> #include <ctime> using namespace std; typedef struct person { int roll; string name; } Person; int main() { int numberofperson; cout << "Number of people: "; cin >> numberofperson; srand(time(NULL)); // 动态分配数组 Person* people = new Person[numberofperson]; int i; for (i = 0; i < numberofperson; i++) { cout << "Write the " << i + 1 << ". name of the person: "; cin >> people[i].name; people[i].roll = rand() % 6 + 1; cout << "Roll with dice: " << people[i].roll << endl; } // 释放动态分配的内存 delete[] people; return 0; }
方法2:使用std::vector(推荐)
如果你不想手动管理内存,更推荐用C++标准库的std::vector容器。它不仅会自动帮你处理内存分配和释放,还提供了很多方便的方法来操作元素,比动态数组更安全易用。
修改后的代码示例:
#include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <vector> // 需要包含vector头文件 using namespace std; typedef struct person { int roll; string name; } Person; int main() { int numberofperson; cout << "Number of people: "; cin >> numberofperson; srand(time(NULL)); // 创建指定大小的vector vector<Person> people(numberofperson); int i; for (i = 0; i < numberofperson; i++) { cout << "Write the " << i + 1 << ". name of the person: "; cin >> people[i].name; people[i].roll = rand() % 6 + 1; cout << "Roll with dice: " << people[i].roll << endl; } // 不需要手动释放内存,vector会自动处理 return 0; }
另外补充一点:其实你也可以把typedef struct person简化成struct Person,C++里不需要像C那样用typedef来定义结构体别名,直接写struct Person { ... };就可以直接用Person作为类型名啦。
内容的提问来源于stack exchange,提问作者Tivi
相关产品推荐
相关产品推荐

