这是我写的程序:
#include<iostream>
using namespace std;
int main()
{
int hex[16];
cout << "enter the 16 hexadecimal numbers\n";
for(int i = 0;i < 16;i++)
{
cin >> hex[i];
cout << "input worked\n";
}
}
您能否向我解释为什么&#34;输入有效?&#34;输入&#39; a后再次显示输出。 如果我这样做,该程序是否应该停止?
我的意思是为什么&#34;输入工作&#34; cin停止输入后的行输出?我的意思是如果从cin获取输入有问题,为什么cout仍在工作?
答案 0 :(得分:2)
您必须通过std :: hex传递它,否则它只接受一个整数,您的输入流在内部切换到错误状态,并跳过下一次迭代的输入。这就是你看到剩余迭代的输出的原因。
cin >> std::hex >> hex[i];
答案 1 :(得分:1)
你应该写
if(cin >> hex >> hex[i]) {
cout << "input worked\n";
}
else {
string dummy;
cin.clear();
cin >> dummy;
}
确定输入是否有效。对于hex
IO操纵器,您必须#include <iomanip>
。
答案 2 :(得分:1)
默认输入流如std::cin
期望整数输入为十进制(字符'0'
- '9'
)。如果您想输入十六进制,则需要使用std::hex
:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int hex[16];
cout << "enter the 16 hexadecimal numbers\n";
for(int i = 0;i < 16;i++)
{
// hexedicimal
cin >> std::hex >> hex[i];
cout << "input worked\n";
}
}
此外,您应该在阅读后始终检查信息流。
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
int hex[16];
cout << "enter the 16 hexadecimal numbers\n";
for(int i = 0;i < 16;i++)
{
if(cin >> std::hex >> hex[i])
cout << "input worked\n";
else
{
cout << "bad input try again\n";
cin.clear(); // remove the error
std::string skip;
cin >> skip; // read past bad input
}
}
}
答案 3 :(得分:1)
您为数组hex
命名的事实与编译器无关。它需要十进制输入。
输入a
时,输入无法解析为十进制整数,因此std::cin
设置为错误模式。随后对>>
的调用不再提示用户输入文本,而是立即返回,使流处于错误状态,直到循环结束。
您可以通过多种方式解决此问题:
if (!cin) { /* error handling */ }
。std::hex
的十六进制输入。或者完全使用不同的策略。不是直接读取int
,而是每次循环迭代都可以将输入的整个行读入std::string
。然后可以使用C ++ 11的std::stoi
将该字符串转换为int
,指定基数为16:
#include <iostream>
#include <string>
int main()
{
int hex[16];
std::cout << "enter the 16 hexadecimal numbers\n";
for (int i = 0; i < 16; ++i)
{
std::string line;
std::getline(std::cin, line);
try
{
hex[i] = std::stoi(line, 0, 16);
std::cout << "input worked: " << hex[i] << "\n";
}
catch (std::exception const& exc)
{
std::cout << "input failed\n";
}
}
}