2013-11-27 3 views
0

Следующая программа должна читать некоторые целочисленные значения из ввода и хранить их в массиве до тех пор, пока пользователь не нажмет клавишу «Esc», но я не могу понять, как это сделать. Я попытался использовать его значение ASCII как условие, но оно не работает, или я делаю что-то неправильно. Может кто-нибудь, пожалуйста, помогите мне? Вот код:Использование значения 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

'main' возвращает' int'. Что означает «это не важно»? –

+0

Что нужно сделать для '27'? –

+0

Посмотрите на это http://stackoverflow.com/questions/17174849/c-how-do-i-terminate-my-programm-using-esc-button –

ответ

2

Здесь есть несколько проблем. Первый, и самое главное, - то, что большинство систем будет делать линейный ориентированный вход, что означает , что они подберут много контрольных символов (в том числе, , вероятно, ESC) и сделают что-то с ними внутренне, скорее , чем возвращение их вам; возможно, даже не будет когда-либо видеть ESC на входе.

Для остальных существует ряд проблем с кодом. Сначала - это то, что вы тестируете индекс в массиве (где вы поместите следующий символ), а не против чего-либо , который вы прочли. Во-вторых, вы вводите int, так что вы не увидите никаких персонажей; просто результаты преобразования . (Фактически, если символ ESC делает , вы получите std::cin в состоянии ошибки.) Третье, что вы никогда не проверяете, прошел ли вход .

Лучшим решением было бы принять какое-то другое соглашение для ввода: произнести по одному номеру в строке, с пустой строкой сигнализации конец. В этом случае, вы могли бы написать что-то вроде: (. Вы заметите, что я использовал std::vector, так как вы не знаете впереди, сколько входов вы получите)

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); 
    } 
} 

Если вы действительно хотите использовать ESC, вам, возможно, понадобится третья партийная библиотека по строкам curses, чтобы выполнить ввод raw, , читающий по одному символу за раз, и собирая цифры в строку, для преобразования используя std::istringstream.

+0

Векторная альтернатива велика, но использование Esc обязательно. Спасибо за подсказку! – Georgiana

+0

@Georgiana Тогда вы не можете использовать 'std :: cin'. Я только что тестировал под Windows, и в консольном окне, по крайней мере, ключ-побег никогда не окажется в потоке. Если вас не волнует переносимость, возможно, можно использовать «getch», но это может быть сложно. –

0

Не используйте этот метод Джеймса намного лучше и будете работать на все, но только ради ответа на вопрос, который вы можете сделать. Это не будет работать на всех платформах. Это работает на 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; 

} 

Редактировать: Программы теперь понятнее. Обратите внимание: эта программа не должна использоваться, она очень зависима от платформы и компилятора.

+1

'' 'все еще поддерживается ?! (Я помню это из старых дней MS-DOS, но я не знал, что это все еще вокруг.) –

+0

Его работа над моим визуальным компилятором C++ 2012, но я не рекомендую его работать только на windows i думаю, –

+0

Это явно зависит от окон. С другой стороны, я не уверен, как 'getch' взаимодействует с' std :: cin'. Если бы я использовал его, я бы, вероятно, использовал бы свою собственную 'getline' на основе этого и использовал бы на нем' std :: istringstream' вместо того, чтобы пытаться смешивать 'getch' и' std :: cin << '. –

Смежные вопросы