Member 14110242 Ответов: 2

Как я могу дать выбор как для INT, так и для char в цикле while


Здесь у меня есть циклический код, который продолжает циклировать, если он встречает 1, я хочу иметь возможность циклировать программу либо с пользователем, вводящим 1, либо с "а"

Что я уже пробовал:

<pre> #include <stdio.h>
 int main()
 {
    int choice = 1;
   while (choice == 1){
   int n, count =0;
   printf("enter an integer = ");
   scanf("%d", &n);
   int buffer = n;
   while (buffer!=0)
   {
     buffer/=10;
     count++;
   }
   printf("your number %d has %d digits", n, count);
   printf("\n Do you want to use another number? (1 or A if Yes 2 Or B if NO)\n");
   scanf("%d", &choice);
 }
 return 0;
 } 


Теперь с этим точным кодом я могу только зацикливаться, если я ввожу значение 1, Как я могу также зацикливаться, давая пользователю возможность ввести либо 1, либо "а"

CPallini

Следующий Патриспредложение s, тест на значениях символов ('1', 'A').

2 Ответов

Рейтинг:
0

Patrice T

Ввод с клавиатуры всегда является символом

scanf("%d", &choice);

В этом сканировании вы просите преобразовать его в числовое значение.
choice должно быть это чар
1-это целое число, '1' - символ

Совет: используйте отладчик, чтобы увидеть, что происходит в вашем коде.
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


CPallini

5.

Patrice T

Спасибо

Рейтинг:
0

OriginalGriff

Во-первых, сделайте отступ в своем коде! Если вы этого не сделаете - а вы этого не сделали - тогда вам будет труднее понять, что происходит. Это не так уж плохо с таким маленьким кодом, как этот, но когда он становится больше, это может стать чрезвычайно трудным, если вы не сделаете правильный отступ. Стиль отступа - Википедия[^]
Меня не волнует, если вы используете Whitesmiths:

#include <stdio.h>
int main()
   {
   int choice = 1;
   while (choice == 1)
      {
      int n, count =0;
      printf("enter an integer = ");
      scanf("%d", &n);
      int buffer = n;
      while (buffer!=0)
         {
         buffer/=10;
         count++;
         }
      printf("your number %d has %d digits", n, count);
      printf("\n Do you want to use another number? (1 or A if Yes 2 Or B if NO)\n");
      scanf("%d", &choice);
      }
   return 0;
   }
Или даже отвратительный 1 ТБ:
#include <stdio.h>
int main(){
   int choice = 1;
   while (choice == 1){
      int n, count =0;
      printf("enter an integer = ");
      scanf("%d", &n);
      int buffer = n;
      while (buffer!=0){
         buffer/=10;
         count++;
      }
      printf("your number %d has %d digits", n, count);
      printf("\n Do you want to use another number? (1 or A if Yes 2 Or B if NO)\n");
      scanf("%d", &choice);
   }
   return 0;
}
Просто выберите стиль и придерживайтесь его!

Когда вы используете scanf для чтения из консоли, тип возвращаемого значения зависит именно от того, что вы указываете в строке формата: в вашем случае "%d" извлекает целочисленное значение, поэтому, если ваш пользователь наберет "1" и нажмет ENTER, оно будет работать ... но если он нажмет "а", он заблокируется, рухнет или иначе потерпит неудачу, потому что "а" - это не целое число!

Я бы посоветовал вам использовать scanf для возврата строки и проанализировать ее, чтобы узнать, что ввел пользователь:
char inp[100];

scanf("%s", inp);
choice = atoi(inp);
И избавьтесь от опции "А" / "Б".


Stefan_Lang

Никогда не слышал о "1 ТБ" как стиле отступа, только размер памяти ;-p
Я знаю этот стиль под названием "египетские скобки" (см. https://blog.codinghorror.com/new-programming-jargon/ ;-) )

Лично я считаю, что Whitesmiths-это худший из возможных стилей, поскольку именно в этом стиле труднее всего определить конец блока. Это очень неприятно в сцепленных блоках if-else.

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

ПО МОЕМУ

OriginalGriff

"Одна истинная скобка" - мерзость в глазах всего того, что есть развитие.
И наоборот, я нахожу Whitesmiths наиболее читаемым, так как весь код, связанный с блоком, имеет отступ до одного и того же уровня, независимо от того, является ли это одной строкой кода или блоком кода со скобками.

Но для того, чтобы создать мир, нужно все!