2015-07-20 2 views
1

В настоящее время я пытаюсь научить себя C, так как считаю, что это будет хороший переход на C++ и C# (а также получение головного двора до начала занятий). Так что я решил написать эту петлю здесь:Петля повторяется?

#include <stdio.h> 

int main() 
{ 
    bool continueLoop = true; 
    char response; 
    printf("ARE YOU READY TO RUMBLE?!?!\n Y/N\n"); 
    response = getchar(); 
    int counter = 0; 

     do 
     { 
      counter++; 
      if (response == 'Y') 
      { 
       printf("AWESOME!"); 
       continueLoop == false; 
       return 0; 
      } 
      else if (response == 'N') 
      { 
       printf("YOU FAIL!"); 
       continueLoop == false; 
       return 0; 
      } 
      if (continueLoop == true) 
      { 
       printf("I do not understand your input!\n"); 
       printf("Please reinput! Y/N\n"); 
       response = getchar(); 
      } 
      if(counter == 5) 
      { 
       printf("Exiting!"); 
       continueLoop == false; 
       goto exit; 
      } 
     }while (continueLoop == true); 

    exit: 
     return 0; 
} 

Мой вопрос (ы) является (являются) следующим образом: Почему это, когда, если I вход, например, «М», как мой ответ сам по себе, это будет цикл в два раза ; однако, если ему дано надлежащее условие, то оно заканчивается правильно.

Кроме того, вместо getchar() я должен вместо преобразования ответа в одну длину массива, а затем попытаться сравнить его как-то, или, возможно, это должно быть сделано с помощью заявления PRINTF, как так printf("ARE YOU READY TO RUMBLE?!? \n %s", response);

Если это поможет, я я использую C-Lion в качестве моей IDE, поскольку я отказываюсь писать какой-либо код в vi, emacs или в блокноте.

EDITED КОД

int main() 
{ 


    char response; 
    printf("ARE YOU READY TO RUMBLE?!?!\n Y/N\n"); 
    scanf(" %c", &response); 

    int counter = 0; 


    while (counter < 5) 
    { 
     counter++; 
     if (response == 'Y') 
     { 
      printf("AWESOME!"); 

      return 0; 
     } 
     else if (response == 'N') 
     { 
      printf("YOU FAIL!"); 

      return 0; 
     } 
     else 
     { 
      printf("I do not understand your input!\n"); 
      printf("Please reinput! Y/N\n"); 
      response = getchar(); 
     } 

    } 


    return 0; 


} 
+3

При вводе 'M' вы нажимаете два ключа. Вот почему цикл выполняется дважды.И используйте ==, когда вы хотите * сравнить * две вещи и * = *, когда хотите назначить две вещи. Также использование 'goto' нас считается плохой практикой. В этом случае вы можете заменить 'goto'' break'. –

+1

Сторона примечания: 'while (continueLoop)' достаточно. – m0skit0

+0

.... второй ключ, согласно комментарию * Cool Guy *, является клавишей Enter. – alk

ответ

3

При вводе M, вы на самом деле не только ввод M; вы вводите M, за которым следует новая строка. Итак, getchar(3) вернет M, когда вы его сначала назовете, а затем он вернет \n на второй звонок. Следовательно, цикл выполняется дважды.

Вы можете записывать ввод и игнорировать пробелы (символы новой строки, вкладки, пробелы и т. Д.) С помощью scanf(" %c", &response). Обратите внимание на ведущие пробелы в строке формата; требуется отменить scanf(3), чтобы пропустить пробелы.

Также эти высказывания внутри первых двух, если являются бесполезными:

continueLoop == false; 

Вы сравниваете continueLoop к false, а затем выбросить результат далеко (если вы не компиляции с -Wall, вы должны, потому что это весьма вероятно, дать вам предупреждение).

Вы, вероятно, хотите назначение вместо сравнения:

continueLoop = false; 
+0

Хм, правда, не заметил неправильного знака. Поэтому я решил изменить это, и также я изменил свой вывод printf следующим образом: ** printf («ВЫ ГОТОВЫ К ПРОМЕЖУТО?!?! \ N Y/N \ n% c», & response); ** Я все еще сталкиваюсь с одной и той же проблемой, неправильно ли я ее отредактировал? – SomeStudent

+0

@Ageoffan Вы не можете обойти обе вещи с помощью 'printf (3)'. 'printf (3)' write output, 'scanf (3)' читает ввод. Оставьте 'printf (3)' как было раньше, а после 'printf (3)' замените 'response = getchar();' с помощью 'scanf («% c », & response);'. –

+0

Вижу, не заметил, что это scanf. Поэтому, чтобы подтвердить, исправляю ли я его правильно? ** ответ char; printf («ВЫ ГОТОВЫ К ПРАВИЛО?!?! \ N Y/N \ n»); scanf ("% c", & response); ** – SomeStudent

-2

У вас есть несколько ошибок в коде.

первый, если вы хотите что-то повторить N количество раз, используйте for контур, а не while. Во-вторых, если вы хотите прервать цикл раньше, попробуйте использовать break вместо булевых. И, наконец, его избыточность, чтобы изменить логическое значение на false, а затем return 0;, так как вы выходите из функции.

int main() 
{ 
    char response; 
    int i=0; 
    for (i=0; i<5; i++) 
    { 
     printf("ARE YOU READY TO RUMBLE?!?!\n Y/N\n"); 
     response = getchar(); 
     if (response == 'Y' || response == 'y') 
     { 
      printf("AWESOME!"); 
      break; 
     } 
     else if (response == 'N' || response == 'n') 
     { 
      printf("YOU FAIL!"); 
      break; 
     } 
     else 
     { 
      printf("I do not understand your input!\n"); 
     } 
    } 
    return 0; 
} 
+0

Это, похоже, вообще не отвечает на вопрос. – alk

+0

Я действительно ценю код, но почему-то мой компилятор говорит, что i ++ - недостижимый код? Я задаюсь вопросом, есть ли на данный момент проблема C-lion. – SomeStudent

+0

переместите этот int i из цикла for, объявите i в начало –

-1

лучше использовать scanf("%c",&ch); вместо getchar(), потому что он будет возвращать «\ п» второй раз, когда вы звоните. другой код выглядит отлично.

Как один из моих друзей указал, что такое же поведение для scanf такое же. то вы можете использовать getc

c = getc(stdin); 
+0

'scanf (3)' выпадает обычное пропущенное пробел с '% c'. Это будет иметь тот же эффект. –

+0

Надеюсь, что getc() будет работать в этой точке –

+0

Когда вы скажете scanf (3), это то, что я должен написать (которое я предполагаю, не с тех пор, как это вызовет ошибку), или что это вынужденное место, выбрать материал? – SomeStudent

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