Массив Char не может сохранять символы в качестве своих членов. Система паролей с использованием ATmega8 - PullRequest
0 голосов
/ 28 апреля 2019

Я работал с системой, которая считывает некоторые символы с определенной клавиатуры, передает их на 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 Ответ

0 голосов
/ 29 апреля 2019

Вы начинаете выделять мне 4 байта с:

char* pass = (char*)calloc(PS, sizeof(char));

Затем вы вызываете free(pass), прежде чем даже использовать выделенные данные, только для того, чтобы затем выделить ноль байтов с:

pass = (char*)calloc(0, sizeof(char));

Если нет смысла выделять только свободные без использования выделения или выделять ноль байтов. Распределение нулевых байтов не определено, но ничего хорошего или полезного не произойдет, если вы попытаетесь записать такое распределение, как вы.

Постоянно перераспределение для добавления одного байта за раз также не рекомендуется. Для начала было бы лучше выделить буфер разумной длины и, если вам нужно расширить, расширить на количество символов в чанке.

В любом случае неясно, почему вы динамически распределяете и перераспределяете, чтобы разрешить ввод произвольного числа символов, которые вы не используете. Было бы проще и детерминистичнее просто принять четыре символа в массиве фиксированной длины и отбросить любой посторонний ввод.

Не существует такого понятия, как " пустой символ ", calloc уже инициализировал присвоение нулю (нулевой символ).

Я почти уверен, что у этого кода много других проблем, но он должен был определить, что вы пытаетесь сделать, чтобы посоветовать; Вы бы хорошо использовать отладчик.

...