Что там не так?
Прежде всего, необходимо пересмотреть код. Вы ссылаетесь на функцию с именем pin()
, исходный код которой мы не знаем. Далее мы сталкиваемся с крошечным конфликтом имен (int pin;
, int pin();
). Слишком много блоков кода. Переменные имеют плохое имя (new_pin
не новый вывод, old_pin
не старый). Цикл для генерации вывода бесполезен, поскольку вы переопределяете переменную без сохранения старых случайностей. Многострочные строки без \
в printf
(и других) запрещены (я заметил их где-то рядом с Вашим исходным кодом). exit
отсутствует парантез. Это касается синтаксиса, оптимизации кода и качества имен.
Код рекурсивно вызывает main, и это, конечно, не очень хорошая идея (если Вы не знаете, что делаете!)
Как исправить код.
Я отформатировал и удалил int pin();
объявлений, поскольку они были избыточными. Сложность блоков кода была уменьшена, а ненужный импорт библиотеки был удален. Цикл for был упрощен (поскольку он был избыточным). Код теперь выглядит так:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int pin, new_pin, old_pin = 1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if (pin == old_pin)
printf("PIN succefully verified.\n");
else if (pin != old_pin) {
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to re-enter or 0 to exit\n");
new_pin = getchar();
if (new_pin == '1') {
int i, random;
printf("Your new pin is: %4d\n" rand() % 9999);
main();
} else if (new_pin=='2')
main();
else {
printf("Exiting the program....\n");
return 0;
}
}
}
Теперь давайте реализуем функционал, сделанный неправильно. Новый штифт сломался так сильно, что объяснять его бессмысленно. Лучше получить новый. Значения были статизированы, поэтому они не исчезнут после создания нового набора локальных переменных.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
static int pin, new_pin, validPin = 1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if (pin == validPin)
printf("PIN succefully verified.\n");
else if (pin != validPin) {
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to fall back or any other key to exit.\n");
new_pin = getchar();
if (new_pin == '1') {
validPin = rand() % 9999;
printf("Your new pin is: %4d.\n", validPin);
main();
} else if (new_pin=='2')
main();
else {
printf("Exiting the program.\n");
return 0;
}
}
}
Теперь давайте вернемся к основному рекурсивному антипаттерну и разделим код на подпроцедуры.
#include <stdio.h>
#include <stdlib.h>
int proc() {
/* ... the code in partially unmodified form goes here. */
}
int main(void) {
while(!proc());
}
Наконец, давайте возьмемся за переменную область видимости, чтобы уменьшить ее до абсолютного минимума, и поместим сообщение о выходе в конце main. Код в конце выглядит так:
#include <stdio.h>
#include <stdlib.h>
int proc() {
int pin;
static int validPin = 1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if (pin == validPin)
printf("PIN succefully verified.\n");
else if (pin != validPin) {
int command;
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to fall back or any other key to exit.\n");
command = getchar();
if (command == '1') {
validPin = rand() % 9999;
printf("Your new pin is: %4d.\n", validPin);
return 0;
} else if (command == '2')
return 0;
else
return 1;
}
return 1;
}
int main(void) {
while(!proc());
printf("Exiting the program.\n");
}
Так как некоторые онлайн-компиляторы C могут неправильно реагировать на getchar()
, просто используйте scanf()
, как вы на самом деле:
int command;
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to fall back or 0 to exit:\n");
scanf("%d", &command);
if (command == 1) {
validPin = rand() % 9999;
printf("Your new pin is: %4d.\n", validPin);
return 0;
} else if (command == 0)
return 1;
else
return 0;
Приложение
Мой окончательный код мог бы быть улучшен с помощью бого-процедуры proc()
в верификаторе булавок и обработчиках команд, но приложение достаточно простое, чтобы сохранять краткость. В вашей кривой обучения этот пример приложения может быть хорошим фрагментом кода для обучения навыкам рефакторинга.
Надеюсь, мой отзыв помог вам.