我想将数字读入固定大小为10的静态数组,但用户可以通过输入字符E
来打破循环。
这是我的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int myArray[10];
int count = 0;
cout << "Enter upto 10 integers. Enter E to end" << endl;
for (int i = 0; i < 10; i++)
{
cout << "Enter num " << i + 1 << ":";
cin >> myArray[i];
if (myArray[i] != 'E')
{
cout << myArray[i] << endl;
count++;
}
else
{
break;
}
}
cout << count << endl;
system("PAUSE");
return 0;
}
但是,在输入E
时,我会得到以下结果:
Enter upto 10 integers. Enter E to end
Enter num 1:5
5
Enter num 2:45
45
Enter num 3:25
25
Enter num 4:2
2
Enter num 5:E
-858993460
Enter num 6:-858993460
Enter num 7:-858993460
Enter num 8:-858993460
Enter num 9:-858993460
Enter num 10:-858993460
10
Press any key to continue . . .
如何以最简单的方式修复此代码?
答案 0 :(得分:0)
cin
无法将字符'E'
解析为int
。解决方案是从用户检查中读取字符串,如果它不是&#34; E&#34; (它是一个字符串而不是单个字符,因此您需要使用双引号)然后尝试将字符串转换为int
。但是,这种转换可能会引发异常(见下文)。
最简单的解决方案:
#include <iostream>
#include <cmath>
#include <string> //for std::stoi function
using namespace std;
int main()
{
int myArray[10];
int count = 0;
cout << "Enter upto 10 integers. Enter E to end" << endl;
for (int i = 0; i < 10; i++)
{
cout << "Enter num " << i + 1 << ":";
std::string input;
cin >> input;
if (input != "E")
{
try
{
// convert string to int this can throw see link below
myArray[i] = std::stoi(input);
}
catch (const std::exception& e)
{
std::cout << "This is not int" << std::endl;
}
cout << myArray[i] << endl;
count++;
}
else
{
break;
}
}
cout << count << endl;
system("PAUSE");
return 0;
}
std::stoi
查看try
。它可以抛出异常,因此您的程序将突然(通过终止)结束,这就是围绕它的catch
和{
"request": [
{
"md5": "8dfa1440953c3d93daafeae4a5daa326",
"features": [
"te",
"av",
"extraction"
],
"file_name": "example.xls"
"te": {
"reports": [
"xml",
"pdf"
]
}
"extraction": {
"method": "pdf"
}
}
]
}
块的原因。当用户在字符串中放入一些垃圾值时,您需要处理这种情况。
答案 1 :(得分:0)
如果您对此进行调试,您会发现所有myArray[i]
都是-858993460 (=0x CCCC CCCC)
,这是堆栈中未初始化变量的值。
将E
添加到int
变量myArray[i]
时。 std::cin
会将州旗badbit
设置为1
。
然后当你运行cin >> myArray[i]
时,它会跳过它。换句话说,什么都不做。
最后,您将得到上述结果。
答案 2 :(得分:0)
只需使用:
char myArray[10];
因为在获取输入控制台时获取字符然后尝试将char
转换为int
这是不可能的,并将默认值存储在std::cin
中,即&#39; E&# 39;到0
(默认值为int)。
使用以下代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
char myArray[10];
int count = 0;
cout << "Enter upto 10 integers. Enter E to end" << endl;
for (int i = 0; i < 10; i++)
{
cout << "Enter num " << i + 1 << ":";
cin >> myArray[i];
if (myArray[i] == 'E')
{
break;
}
else
{
cout << myArray[i] << endl;
count++;
}
}
exitloop:
cout << count << endl;
system("PAUSE");
return 0;
}
<强>输出:强>
Enter upto 10 integers. Enter E to end
Enter num 1:1
1
Enter num 2:E
1
sh: 1: PAUSE: not found
答案 3 :(得分:0)
问题在于,尝试将E
作为int
读取失败,并将流置于错误状态,停止阅读(您不会注意到它,因为它没有#&# 39;在那之后做任何事情)并使你的数组元素保持未初始化。
最简单的方法是打破任何读取整数的失败:
for(int i = 0; i < 10; i++)
{
cout << "Enter num " << i + 1 << ":";
if (cin >> myArray[i])
{
cout << myArray[i] << endl;
count++;
}
else
{
break;
}
}
如果您想要专门检查E
,则需要先读取字符串,然后将其转换为int
,如果它不是E
。
作为奖励,您需要处理int
和E
的所有内容,这会使代码复杂化。
像这样:
int count = 0;
string input;
while (cin >> input && count < 10)
{
if (input == "E")
{
break;
}
istringstream is(input);
if (is >> myArray[count])
{
cout << myArray[count] << endl;
count++;
}
else
{
cout << "Please input an integer, or E to exit." << endl;
}
}