Массив Char не может сохранять символы в качестве своих членов. Система паролей с использованием ATmega8
Я работал с системой, которая считывала некоторые символы с определенной клавиатуры, передавала их ATmega8, а затем передавала их на дисплей один за другим (этот шаг работает правильно), но если я хочу показать все массивы символов, Я обнаружил, что динамический массив в первой позиции сохраняет нулевое значение, во втором - пустой пустой символ, а последующие символы сохраняются правильно. Я не вижу ошибок в коде, поэтому мне нужна помощь.
Эта кодовая функция должна возвращать 4-элементный массив символов с последовательным чтением символов с клавиатуры.
char* askPass(void){
int i;
char key;
#define PS 4
char* pass = (char*)calloc(PS, sizeof(char));
clear:
lcd_clear();
lcd_gotoxy(0, 0);
lcd_puts("Enter the password:");
lcd_gotoxy(0, 1);
lcd_puts(">>");
free(pass);
pass = (char*)calloc(0, sizeof(char));
for (i=0;i<PS;i++) pass[i] = '';
for (i=0; i<PS; i++) {
key = '-';
key = readKey();
lcd_gotoxy(3+i, 1);
if (key == 'C') {
goto clear;
} else if (key == '-'){
lcd_putchar('|');
delay_ms(10);
lcd_gotoxy(3+i, 1);
lcd_putchar(' ');
delay_ms(10);
lcd_gotoxy(3+i, 1);
i--;
} else {
pass = (char*)realloc(pass, i*sizeof(char));
*(pass+i) = key;
lcd_putchar(*(pass+i));
delay_ms(20);
}
}
/// there is an error:
/// serial input: 1234
/// lcd output: !* 34!
/// correct output: !1234!
lcd_gotoxy(0,2);
lcd_puts("!");
for (i=0; i<PS; i++) {
if (!(*(pass+i))) lcd_putchar('*');
else lcd_putchar(*(pass+i));
}
lcd_puts("!");
// end error block
return pass;
} // can't return correct array value
/ * Все тесты показывают это:
Serial input word: abcd
Output: !* cd!
Correct output: !abcd!
* /
1 ответ
Вы начинаете выделять 4 байта с:
char* pass = (char*)calloc(PS, sizeof(char));
Тогда вы звоните free(pass)
прежде чем вы даже используете выделенные данные, только чтобы затем выделить нулевые байты с помощью:
pass = (char*)calloc(0, sizeof(char));
Если нет смысла выделять только для освобождения без использования выделения или выделять ноль байтов. Распределение нулевых байтов не определено, но ничего хорошего или полезного не произойдет, если вы попытаетесь записать в такое распределение, как вы.
Постоянно перераспределение для добавления одного байта за раз также не рекомендуется. Для начала было бы лучше выделить буфер разумной длины и, если вам нужно расширить, расширить на количество символов в чанке.
В любом случае неясно, почему вы динамически выделяете и перераспределяете, чтобы разрешить ввод произвольного числа символов, которые вы не используете. Было бы проще и детерминистичнее просто принять четыре символа в массиве фиксированной длины и отбросить любой посторонний ввод.
Там нет такого понятия, как "пустой персонаж", calloc
уже инициализировал присвоение нулю (нулевой символ).
Я почти уверен, что у этого кода есть много других проблем, но он должен был определить, что вы пытаетесь сделать, чтобы дать совет; Вы бы хорошо использовать отладчик.