Эта строка:
scanf("%s %s", username, password);
по своей сути небезопасна (если только у вас нет полного контроля над тем, что будет отображаться на стандартном входе вашей программы).Формат "%s"
гласит, что нужно прочитать произвольно длинную последовательность непробельных символов.Как бы ни был длинен целевой массив, достаточно длинное слово (скажем, вызванное тем, что ваша кошка сидит на клавиатуре) переполнит его.
Вы можете использовать модификатор длины, чтобы ограничить размер ввода.Например (не проверено):
scanf("%36s %36s", username, password);
или, что лучше:
scanf("%*s, %*s", USERNAME_MAX_LEN, username, PASSWORD_MAX_LEN, password);
Но, вероятно, лучше использовать fgets()
, чтобы прочитать всю строку за раз, а затем использовать,скажем, sscanf()
для обработки строки после того, как вы ее прочитали.
И в вашем вызове printf
есть возможная проблема:
printf("username-len: %ld, password-len: %ld\n",
strlen(username),
strlen(password));
strlen()
возвращает результатТип size_t
, но "%ld"
требует аргумент типа long int
.Если ваша система поддерживает это, вы можете использовать "%zu"
для вывода значения типа size_t
, но это не на 100% переносимо.Или вы можете преобразовать значение size_t
, скажем, в unsigned long:
printf("username-len: %lu, password-len: %lu\n",
(unsigned long)strlen(username),
(unsigned long)strlen(password));
Возможно, но не очень вероятно, что это может привести к тому, что ненулевые значения size_t
будут отображаться как 0.