В вашем коде есть ряд проблем, которые я попытаюсь здесь решить.
Во-первых, как уже упоминалось в комментариях, ваши два цикла for
будут (скорее всего) go " за пределами », как индексы массива в C
, начинающиеся с ноль и заканчивающиеся на« n - 1 »(где« n »- размер массива).
Во-вторых, Функции isupper()
и isdigit()
(обязательно) не возвращают «1» для «положительного результата» - спецификация гласит только, что они возвращают ненулевое . Таким образом, мы можем просто проверить возвращаемое значение как «логическое» значение (ноль будет равняться «ложному», а любой ненулевой будет равняться «истинному»).
Наконец, вместо того, чтобы запускать циклы for
для всего буфера password
, вам нужно запускать только до тех пор, пока не будет найден завершающий символ nul
- после этого вы узнаете, что требуемая заглавная буква или ди git не включены в строка.
Вот «рабочая» версия вашего кода с добавленными комментариями, где я внес изменения:
int main()
{
char password[25];
int i;
int x;
printf("Create a strong password (must contain an uppercase letter and a number, and must be at least 8 characters) :\n");
scanf(" %s", password);
for (i = 0; i < 25; i++) { // password[24] is the last possible element - NOT password[25].
if (isupper(password[i])) { // "isupper()" will return NON-ZERO (but not necessarily 1!)
break;
}
else if (password[i] == '\0') { // we've reached the end of the string and not found an uppercase...
printf("\nPlease make sure that your password contains an uppercase letter and try again.\n");
break;
}
}
for (x = 0; x < 25; x++) { // as before, use "x < 25" rather than "x <= 25"
if (isdigit(password[x])) { // "isdigit()" will return NON-ZERO (but not necessarily 1!)
break;
}
else if (password[x] == '\0') { // we've reached the end of the string and not found a digit...
printf("\nPlease make sure that your password contains a number and try again.\n");
break;
}
}
return 0;
}