Помимо правильно диагностированной проблемы с strcat()
, берущей две строки - почему вы проигнорировали предупреждения компилятора, или если не было предупреждений, почему у вас не включены предупреждения?Как я уже говорил, помимо этой проблемы вам также необходимо учитывать, что произойдет, если вы получите EOF, и вам также нужно беспокоиться о начальном значении 'c' (которое может случайно быть '\ n', хотя, вероятно, это не так.'t).
Это приводит к следующему коду:
int c;
char pass[20] = "";
char *end = pass + sizeof(pass) - 1;
char *dst = pass;
while ((c = getchar()) != EOF && c != '\n' && dst < end)
*dst++ = c;
*dst = '\0'; // Ensure null termination
Я переключился с' mygetch () 'на' getchar () '- главным образом потому, что то, что я говорю, относится к этому иможет не относиться к вашей функции mygetch ();у нас нет спецификации того, что эта функция делает с EOF.
В качестве альтернативы, если вы должны использовать strcat()
, вам все равно нужно отслеживать длину строки, но вы можете сделать:
char c[2] = "";
char pass[20] = "";
char *end = pass + sizeof(pass) - 1;
char *dst = pass;
while (c[0] != '\n' && dst < end)
{
c[0] = mygetch();
strcat(dst, c);
dst++;
}
Не так элегантно, как все это - использование strcat()
в контексте является излишним.Вы могли бы, я полагаю, сделать простой подсчет и многократно использовать strcat(pass, c)
, но это имеет квадратичное поведение, так как strcat()
должен пропускать 0, 1, 2, 3, ... символов на последующих итерациях.Напротив, решение, в котором dst указывает на NUL в конце строки, означает, что strcat()
не должно ничего пропускать.Однако при добавлении фиксированного размера в 1 символ вам, вероятно, будет лучше с первым циклом.