Как перезапустить программу без сохранения ее значений (C) - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь создать программу, которая может читать и подсчитывать, сколько цифр имеет число. Это мой код.

#include <stdio.h>
#include <stdlib.h>

int main(){
   int a, b=0;
   printf("Hey welcome to how many digits your number has!\n");
   xyz:
   printf("To begin enter a Number = ");
   scanf("%d",&a);

   while (a!=0) {
    a/=10;
    ++b;
   }

   printf("your number has %d digits\n",b);
   int choice;
   printf("do you want to use another number?\nIf yes enter \"1\"\nif no enter \"2\"\n");
   scanf("%d",&choice);

   if (choice==1){
    goto xyz;
   }

   else if (choice==2){
    return 0;
   }

return 0;
}

Это прекрасно работает впервые, но когда я идувыполните резервное копирование и повторите, кажется, что значение 'b' из предыдущей попытки было сохранено .. как я могу начать снова без сохранения значения переменной 'b' и сохранить значение b = 0?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Совершенно очевидно, что ошибка b не инициализируется повторно до 0 внутри детали внутри метки xyz.Следовательно, значения просто продолжают складываться вместо того, чтобы начинать отсчет для нового ввода.поэтому исправление будет следующим:

xyz:
b = 0;

Но рекомендуется не использовать goto, так как это приводит к созданию запутанного кода и может привести к бесконечным циклам.См. Эту статью ниже:

Почему вы должны избегать goto?

Использовать while или do-while вместо ... следующим образом:

#include <stdio.h>
#include <stdlib.h>

int main(){
   int a, b=0, choice; //declared choice here
   printf("Hey welcome to how many digits your number has!\n");
   do {
   b = 0;
   printf("To begin enter a Number = ");
   scanf("%d",&a);

   while (a!=0) {
    a/=10;
    ++b;
   }
             // removed declaration of choice from here and placed it along with other declarations in main()
   printf("your number has %d digits\n",b);
   printf("do you want to use another number?\nIf yes enter \"1\"\nif no enter \"2\"\n");
   scanf("%d",&choice);
   }while(choice == 1); //repeat the process again if user inputs choice as 1, else exit

return 0;
}
0 голосов
/ 06 декабря 2018

Это потому, что ваше goto не включает инициализацию b = 0

xyz:
b = 0;

I настоятельно . Рекомендуем забыть ключевое слово goto.Это легко приводит к нечитаемому и не отлаживаемому коду.Попробуйте использовать цикл вместо:

int main()
{
   int choice = 1;
   while (choice == 1)
   {
       int a, b = 0;
       printf("Hey welcome to how many digits your number has!\n");
       printf("To begin enter a Number = ");
       scanf("%d", &a);

       while (a != 0)
       {
           a /= 10;
           ++b;
       }

       printf("your number has %d digits\n",b);
       //removed declaration of choice
       printf("do you want to use another number?\nIf yes enter \"1\"\nif no enter \"2\"\n");
       scanf("%d", &choice);
    }
    return (0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...