Самый простой способ - использовать fgets
.Обратите внимание, что scanf("%s")
получит только одно слово, а в некоторых паролях могут быть пробелы.Но настоящая причина использования fgets
заключается в том, что вы можете предотвратить переполнение, как показано ниже:
char password[1000];
fgets(password,sizeof(password),stdin);
char *cp = strchr(password,'\n');
if (cp != NULL)
*cp = 0;
Это самое простое решение.
Но, если вы действительно вам нужен большой пароль [неопределенной длины], вы можете вырастить переменную password
из realloc
, как это было бы сделано для динамического массива:
char *password = NULL;
int pwmax = 0;
int pwlen = 0;
void *
xrealloc(void *ptr,size_t len)
{
void *tmp;
tmp = realloc(ptr,len);
if (tmp == NULL) {
free(ptr);
exit(1);
}
return ptr;
}
while (1) {
int chr = fgetc(stdin);
if (chr == EOF)
break;
if (chr == '\n')
break;
if (pwlen >= pwmax) {
if (pwlen >= 1000000) {
fprintf(stderr,"password beyond reasonable max limit\n")
exit(1);
}
pwmax += 100;
password = xrealloc(password,pwmax);
}
password[pwlen++] = chr;
}
password = xrealloc(password,pwlen + 1);
password[pwlen] = 0;