c++ - 如何将用户输入存储在数组中并检查两个数组是否具有相同的元素
问题描述
我正在尝试制作一个测验检查器,用户将在其中输入他们的答案,它会自动检查数组。有小费吗?
这是我的代码:
int main()
{
string aswer[] = { "D", "C", "D", "D", "A"); //
char input[5];
int counter ;
int points = 0;
cout << "Welcome and Good luck!\n";
for (counter = 0; counter < 5; counter++) {
cout << counter << " Choose from letters A-D: \n";
cin >> input;
}
for (int i = 0; i < 5; ++i) {
cout << "\n you enter " << input[i] << endl;
}
foreach (char item in answer){
foreach (char item1 in inputs){
If (item == item1){
points = points +1
}
}
}
return 0;
}
解决方案
提示——选择存储时要始终如一。如果您使用 a std::string
for the answer
(不是显示的错误数组std::string
),那么也使用 a std::string
for input
。但是,如果您必须使用 POA(普通旧数组),那对于教育目的来说很好——您只是缺少所有自动内存管理和边界保护。
您将std::basic_string初始化为:
std::string answer { "DCDDA" }; /* initialize string (not array of strings) */
(注意:std::
命名空间标识符的使用。请参阅为什么“使用命名空间 std;”被认为是不好的做法?)
不要在代码中使用幻数。5
你坚持你的数组声明和你的循环限制是一个Magic Number。反而,
#define NCHAR 5 /* if you need a constant, #define one (or more) */
...
char input[NCHAR]; /* array of 5 char (why not string?) */
...
for (int i = 0; i < NCHAR; i++) { /* loop taking input */
当您循环获取输入时,请验证每个输入。用户很可能会生成手册EOF
以取消使用Ctrl+d(或Ctrl+z在 Windows 上)的输入。仅在验证输入后增加存储的字符数,例如
int counter = 0, points = 0; /* counter and points, initialized zero */
std::cout << "Welcome and Good luck!\n\n";
for (int i = 0; i < NCHAR; i++) { /* loop taking input */
std::cout << " " << i << ". Choose from letters A-D: ";
if (std::cin >> input[i]) /* validate input */
counter++; /* only increment on successful input */
}
'\n'
对于您的输出,请了解使用和之间的区别std::endl
,C++:“std::endl”与“\n”</a>。
当您将项目存储在容器中时(例如std::string
),您可以使用基于范围的 for 循环(自 C++11 起)来循环容器中的每个项目。要遍历存储的输入,您必须将循环限制为成功读取为输入的元素数。使用与counter
您的比较限制相同的值,例如
for (auto& item : answer) /* range based for-loop over chars in string */
for (int i = 0; i < counter; i++) /* loop over counter chars in array */
if (item == input[i]) /* if the item matches the input char */
points += 1; /* add point */
总而言之,您将拥有:
#include <iostream>
#include <string>
#define NCHAR 5 /* if you need a constant, #define one (or more) */
int main()
{
std::string answer { "DCDDA" }; /* initialize string (not array of strings) */
char input[NCHAR]; /* array of 5 char (why not string?) */
int counter = 0, points = 0; /* counter and points, initialized zero */
std::cout << "Welcome and Good luck!\n\n";
for (int i = 0; i < NCHAR; i++) { /* loop taking input */
std::cout << " " << i << ". Choose from letters A-D: ";
if (std::cin >> input[i]) /* validate input */
counter++; /* only increment on successful input */
}
std::cout << "\nYou entered:\n"; /* output stored values */
for (int i = 0; i < counter; i++) /* looping only 0 to counter */
std::cout << " input[" << i << "] : " << input[i] << '\n';
for (auto& item : answer) /* range based for-loop over chars in string */
for (int i = 0; i < counter; i++) /* loop over counter chars in array */
if (item == input[i]) /* if the item matches the input char */
points += 1; /* add point */
std::cout << "\nTotal points: " << points << '\n'; /* output total points */
}
示例使用/输出
$ ./bin/points
Welcome and Good luck!
0. Choose from letters A-D: A
1. Choose from letters A-D: B
2. Choose from letters A-D: C
3. Choose from letters A-D: D
4. Choose from letters A-D: E
You entered:
input[0] : A
input[1] : B
input[2] : C
input[3] : D
input[4] : E
Total points: 5
如果所有字符都匹配,则检查最大点数:
$ ./bin/points
Welcome and Good luck!
0. Choose from letters A-D: D
1. Choose from letters A-D: C
2. Choose from letters A-D: D
3. Choose from letters A-D: D
4. Choose from letters A-D: A
You entered:
input[0] : D
input[1] : C
input[2] : D
input[3] : D
input[4] : A
Total points: 11
看看事情,如果你有问题,请告诉我。
推荐阅读
- vb.net - 设置 DataSource 属性时无法修改 DatagridviewCombobox Items 集合
- r - 是否可以为 facet_wrap 中的每一行指定列数?
- c - 使用 sigprocmask 和 sigsuspend 在两个进程之间反弹信号
- java - 获取 java.lang.ClassCastException
- arrays - 在 Flutter 中从 TextForm 的 List 中添加更多价值
- angular - Angular Router 路由保护 CanActivate 总是返回 false
- nosql - 我可以通过 Oracle NoSQL 数据库云服务使用 Intellij 进行应用程序开发吗?
- android-layout - 如何在不同行的回收器视图中显示嵌套数组
- reactjs - React-Leaflet - 更新存储在状态中的 Circle 对象,或者优化 Circles 加载速度
- mysql - 如何在 mysql 工作台中导出/导入存储过程以及表