c++ - 如何将输入存储在动态数组中?
问题描述
所以我正在尝试制作一个将用户输入存储到动态数组中的程序,但我做错了。当我尝试输入一个数字时,让我们说 1,然后我想再试一次,然后我想查看历史记录,唯一显示的是我输入的最后一个数字。有时像1214098101909279242这样的大量播种。
这是我的代码:
#include<iostream>
using namespace std;
int main(){
const int size = 20;
int *num = new int[size];
char answer;
while(true){
cout<<"ENTER NUMBER: \n";
cin>>*num;
cout<<"TRY AGAIN? ";
cin>>answer;
switch(answer){
case 'y':
num[size+1];
system("cls");
break;
default:
cout<<"INPUT HISTORY: \n";
for(int i=0;i<=size;i++){
cout<<num[i];
}
}
}
return 0;
}
解决方案
我的代码有两个主要问题:
- 在这种情况下不需要动态分配,因为size是一个 const 值(并且可以定义为 constexpr,这样更好)。
- 而不是使用标准容器(例如 std::array (用于常量大小数组)或 std::vector (用于动态扩展数组)),而是使用普通指针数组,这是不明智的,在这种情况下可能会导致内存泄漏(例如,如果您将此代码移动到实用程序函数中,因为您永远不会删除 num 数组的内存!),您应该使用 std::unique_ptr 代替!(并更好地阅读有关RAII 成语的信息)。
- 间距和缩进 - 您的代码也应该对其他编码人员可读。
关于您的代码,原始代码具有以下行:
cin >> *num
这意味着将stdin中的值放入num的FIRST位置。在 C/C++ 中,数组只是指向为数组分配的内存的第一个地址的指针。为了访问其他项目,您需要使用 operator[] 或使用带有 operator* 的指针运算(例如:
cin >> *(num + count)
将在位置count获得项目)。此外,如上所述,没有安全措施来禁止写入您可以依赖的无效内存。因此,您应该使用强制索引安全的标准容器。
仅供参考,这是我为获得相同功能而编写的代码:
int main() {
constexpr size_t SIZE = 20;
std::array<int, SIZE> arr;
arr.fill(0);
int last_filled_position = 0;
bool cont = true;
while (cont)
{
int val;
char answer;
cout << "ENTER NUMBER:" << std::endl;
cin >> val;
cout<<"TRY AGAIN? Yes/Print/Stop";
cin >> answer;
arr.at(last_filled_position++) = val;
switch (answer)
{
case 'y':
system("cls");
break;
case 'p':
cout << "INPUT HISTORY: " << std::endl;
for (int val: arr) // With more complex types, you should use const auto&
{
cout << val << ", ";
}
cout << endl;
break;
case 's':
cont = false;
cout << "STOPPING";
break;
}
}
return 0;
}
推荐阅读
- python-3.x - python3:读取两个文本文件并在垂直拆分中打印每个文件,以便于记录比较
- php - DocuSign 意外错误:生产服务器上的 invalid_grant
- python - 我可以将 Wagtail CMS 与 Angular 前端完全集成吗?
- twilio - 在通话结束时使用选择文本消息构建 Twilio Flow
- mongodb - 如何在 MongoDB 聚合 $lookup 结果中填充字段?
- hive - 带有 Sum 和 group By 的 Hive 表
- react-testing-library - React 测试库 getByLabelText 不连接多部分 aria-labelledby
- java - 条码 png 打印在 40 毫米 x 15 毫米大小的标签上的图像在打印时缩小为 20 毫米 x10 毫米且未扫描
- php - PHP中的多维数组合并
- .net - Visual Basic .NET VS 2017 指令 - 缺少构建选项卡