Не удается прервать forloop

#c

#c

Вопрос:

Как я могу прервать forloop после того, как он прочитает все входные данные? прямо сейчас он не прекращает работу. Программа принимает целые числа inout от 0 до 10 и записывает для них слово. проблема в том, что даже если он считывает все входные данные, он все еще работает. Я ищу решение, чтобы остановить его запуск после того, как он прочитает и напечатает все слова для входных данных.

  #include <iostream>
 #include <string>
 #include <array>
 using namespace std;

 int main() {

 int i;
 int digits;

 for(i = 0; i <= 10; i  ) {  
     cin >> digits;
        
     const char *str [] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        
     switch(digits) {
         case 0: cout << str[0] << endl;
             break;
         case 4: cout << str[4] << endl;
             break;
         case 5: cout << str[5] << endl;
             break;
         case 6: cout << str[6] << endl;
             break;
         case 7: cout << str[7] << endl;
             break;   
         case 1: cout << str[1] << endl;
             break;
         case 2: cout << str[2] << endl;
             break;
         case 3: cout << str[3] << endl;
             break;
         case 8: cout << str[8] << endl;
             break;
         case 9: cout << str[9] << endl;
             break;
         }                               
     }
     return 0;      
 }
  

Комментарии:

1. Кстати, вы, вероятно, могли бы заменить весь блок switch / case чем-то вроде if ((digits>=0)amp;amp;(digits<=9)) cout << str[digits] << endl; и при этом получить такое же поведение.

2. в настоящее время вы выходите из коммутатора

3. Почему, казалось бы, случайный порядок ваших case утверждений? Похоже, что это головная боль для обслуживания кода.

4. «Как я могу прервать forloop после того, как он прочитает все входные данные?» — как вы можете узнать, когда все входные данные были прочитаны? Вам гарантировано ровно 11 входных данных? Какой ввод вы пытаетесь предоставить?

5. Привет, Джереми, спасибо за ответ, я использовал ваш метод, который делает то же самое, что и мой, я хочу, чтобы программа остановилась после нажатия клавиши enter. Теперь это все еще происходит после того, как мы нажмем кнопку ввода.

Ответ №1:

Если вы хотите, чтобы ваша программа считывала до десяти цифр (т. Е. Останавливала ее выполнение, если она встречает EOF до того, как были прочитаны десять цифр), вы могли бы сделать это следующим образом:

 for(i = 0; ((i < 10)amp;amp;(cin >> digits)); i  ) { 
   const char *str [] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
   if ((digits>=0)amp;amp;(digits<=9)) cout << str[digits] << endl;
} 
  

Обратите внимание, что >> оператор on cin вернет false при сбое / EOF, что приведет к остановке итерации цикла for в этот момент.

Комментарии:

1. Привет, я использовал ваш метод, и он работает отлично, но проблема в том, что программа открывается после одной записи или нескольких. Я хочу, чтобы это прекратилось, как только мы нажмем enter.

2. << У оператора нет средства для обнаружения символов новой строки — он обрабатывает пробелы и возврат каретки / перевод строки как взаимозаменяемые. Если вы хотите просто проанализировать содержимое одной строки, вам понадобится другой подход, например, вызвать std::getline(cin, myString); , а затем проанализировать содержимое std::string myString; объекта впоследствии.

3. FWIW в большинстве ОС, если вы вводите на терминале для ввода стандартного кода программы, вы можете отправить сигнал EOF, нажав control-D. (Или вы можете передать стандартный идентификатор программы неинтерактивно, например echo "1 2 3 4" | ./my_program , и стандартный идентификатор вашей программы получит EOF в конце переданной строки)

Ответ №2:

ваш for цикл выполняется в течение 11 циклов, а не в течение 10. Вероятно, поэтому вы видите, что оно не заканчивается в конце. вам нужно использовать i < 10 . Не уверен, почему вы также использовали этот огромный переключатель. Вот пример, и он завершает цикл после 10 вводов.

 #include <iostream>
using namespace std;

int main(){
  int i;
  int digits;
  for(i = 0; i < 10; i  ) {  
    cin >> digits;
            
    const char *str [] = {"zero", "one", "two", "three", "four", 
                          "five", "six", "seven", "eight", "nine"};
    if (digits >= 0 amp;amp; digits < 10)
        cout << str[digits] << endl;
                    
  }
  return 0;      
}