以下程序应该从输入读取一些整数值并将它们存储到数组中,直到用户按下“Esc”键,但我无法弄清楚如何做到这一点。我曾尝试使用它的ASCII值作为条件,但它不起作用,或者我做错了什么。有人可以帮助我吗?这是代码:
void main(){
int i=0, a[MAX];
cout <<"Please enter several integer numbers and press Esc when you want to finish" << endl;
while ((i != char(27)) && (i < MAX)) {
cin >> a[i];
i++;
}
答案 0 :(得分:2)
这里有几个问题。第一个,也是最重要的, 大多数系统都会进行面向行的输入,这意味着 他们会拿起很多控制角色(包括 可能,ESC)并在内部做一些事情,而不是 而不是归还给你;甚至可能都不可能 在输入中看到一个ESC。
其他方面,您的代码存在一些问题。该
首先是你正在测试数组中的索引
(你将把下一个角色放在哪里),而不是反对任何东西
你读过第二个是你正在输入int
,所以你
不会看到任何个人角色;只是结果
转换您的输入。 (事实上,如果ESC角色有
通过,你将以错误状态结束std::cin
。)
第三是你从不测试输入是否有
成功了。
更好的解决方案是采用其他一些惯例 输入:每行说一个数字,空行信号 结束。在这种情况下,您可以编写如下内容:
std::vector<int> a;
std::string line;
std::cout << "..." << std::endl;
while ( std::getline( std::cin, line ) && !line.empty() ) {
std::istringstream parse( line );
int value;
parse >> value >> std::ws;
if ( !parse ) {
std::cout << "That wasn't an integer, try again" << std::endl;
} else if ( parse.get() != EOF ) {
std::cout << "Extra garbage at end of line, ignoring it" << std::endl;
} else {
a.push_back( value );
}
}
(你会注意到我使用了std::vector
,因为你不知道
在前面你会得到多少输入。)
如果你真的想使用ESC,你可能需要第三个
派对图书馆,按照curses
的方针,进行原始输入,
一次读一个字符,并将数字收集到
一个字符串,用于使用std::istringstream
进行转换。
答案 1 :(得分:0)
不要这样做使用詹姆斯方法更好,并且将运行evrything但只是为了回答你可以做到这一点的问题。这不适用于所有平台它适用于visual c ++编译器。
# include <iostream>
# include <conio.h>
# include <vector>
using namespace std;
int main()
{
char key;
vector<int> a;
int temp = 0;
while ((key = getch()) != 27)
{
cin >> temp;
a.push_back(temp);
}
for (int i = 0 ; i < a.size() ; i++)
{
cout << a.at(i) << endl;
}
printf("Exit");
cout << endl;
system("Pause");
return 0;
}
编辑:程序现在更清晰。请注意,不应使用此程序,它非常依赖于平台和编译器。