C/C++

Си почему так происходит

Когда я переполняю массив разными символами, например: dfsgdfhgfjkhjlkjljghjgjhgjhg
что есть больше 9, то программа меня шлет и говорит наберика братец пароль еще раз.
А если я переполняю массив одинаковыми символами, : dddddddddddddddddddddddddddd
то программа уезжает: проскакивая несколько циклов и игнорируя функции ввода.

Че за бред, как исправить? Спасиб.
Во-первых, имеет смысл выполнять предварительную проверку введённой строки на превышение длины пароля?
Во-вторых, функция fgets для ввода пароля не подходит, так как она допускает ввод пробелов и в конце вставляет перевод на другую строку, что, согласитесь, противоречит данной задачи. Рекомендую для таких целей использовать scanf_s, например...

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define SIZE_BUFFER 1024
#define SIZE_PASSWORD 10
int main(void) {
char buffer[SIZE_BUFFER] = { 0 };
char password[SIZE_PASSWORD] = { 0 };
char attempt[SIZE_PASSWORD] = { 0 };
system("chcp 1251 > nul");
while (true) {
_Bool flag = false;
printf("Задайте пароль: ");
scanf_s("%s", buffer, _countof(buffer));
while (getchar() != '\n');
if (strlen(buffer) >= SIZE_PASSWORD) {
printf("Допустимая длина пароля %d символов! \n", SIZE_PASSWORD - 1);
continue;
}
strncpy_s(password, SIZE_PASSWORD, buffer, strlen(buffer));
while (true) {
printf("Введите пароль: ");
scanf_s("%s", buffer, _countof(buffer));
while (getchar() != '\n');
if (strlen(buffer) >= SIZE_PASSWORD) {
printf("Допустимая длина пароля %d символов! \n", SIZE_PASSWORD - 1);
continue;
}
strncpy_s(attempt, SIZE_PASSWORD, buffer, strlen(buffer));
if (strcmp(attempt, password) != 0) puts("Неверный пароль!");
else {
flag = true;
break;
}
}
if (flag) break;
}
puts("Вход выполнен!");
system("pause > nul");
return 0;
}
Сергей Цыпенко
Сергей Цыпенко
61 556
Лучший ответ
Денис Савилов Боже спс, я весь день потратил исправить этот баг, использовал scanf() scanf_s, fgets() gets()

Буду адаптировать под свой код, спасибо
Какая IDE?
fgets читает столько символов, сколько попросили (8 из строки + девятый нулевой в конце).
Когда введено много одинаковых символов, первый fgets прочитал первые 8, второй fgets прочитал ещё 8, они, конечно же, совпали.
Ayadil Beketayev
Ayadil Beketayev
9 861