问题描述
我正在尝试做一个测验检查器,用户将在其中输入答案,它将自动检入数组。有提示吗?
这是我的代码:
int main()
{
string aswer[] = { "D","C","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;
}
解决方法
提示-选择存储时要保持一致。如果您为std::string
使用answer
(未显示std::string
的错误数组),则也为std::string
使用input
。但是,如果必须使用POA(普通的老式数组),这对于教育目的是很好的-您只是缺少所有自动内存管理和边界保护。
您将std::basic_string初始化为:
std::string answer { "DCDDA" }; /* initialize string (not array of strings) */
(注意:使用std::
名称空间标识符。请参见Why is “using namespace std;” considered bad practice?)
请勿在代码中使用魔术数字。您在数组声明中使用的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 (或Windows上的 Ctrl + z )输入。仅在验证输入后才增加存储的字符数,例如
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” vs “\n”之间的区别。
当您将项目存储在容器中(例如std::string
)时,可以使用Range-based for loop (since 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,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
仔细研究一下,如果您有任何疑问,请告诉我。