2013-05-07 19 views
0

我正在嘗試開發一個使用程序集和C的基本操作系統,而且我在開發鍵盤驅動程序時遇到困難。 我用以下兩種功能通過鍵盤來獲得來自用戶的線C中的基本鍵盤處理程序

char getchar() { 
    char c; 
    int i; 

    while(char_count == 0); 

    c = buffer[0]; 

    for(i=0 ; i<KEYBOARD_BUFFER_SIZE ; i++) { 
    buffer[i] = buffer[i+1]; 
    } 

    char_count--; 
    push_index--; 

    return c; 
} 

char* getline(unsigned char password_mode) { 
    char* line; 
    char c = 0x00; 
    int index = 0; 

    while(c != '\n') { 

     if(c) { 
      if(!password_mode) 
       printch(c); 
      else 
       printch('*'); 

      if(c == '\b') 
       index--; 
      else 
       line[index++] = c; 
    } 

      c = getchar(); 
    } 

    line[index] = '\0'; 

    return line; 
} 

然而,當我試圖獲取用戶名和用戶密碼,我問他,然後再輸入用戶名輸入密碼,問題是密碼覆蓋導致錯誤數據的用戶名。如何將密碼寫入用戶名?這是否意味着getline()中分配的char* arr在每次訪問該函數時都具有相同的地址? 感謝您的幫助

+0

製作緩衝區的副本? (你有一個'malloc'或者什麼東西實現了吧? – michaelb958 2013-05-07 23:01:58

+0

我不認爲我可以使用'malloc' ,而且我正在用'-freestanding'模式編譯 – 2013-05-07 23:14:48

+0

我知道你不能使用股票' malloc';我已經嘗試過系統編程,我想知道你是否實現了一個'malloc'或'kmalloc'什麼的(你應該擔心密碼之前擔心的) – michaelb958 2013-05-07 23:21:20

回答

1

您的第一個問題是您沒有分配任何內存來讀取您的輸入。 char* line;將行聲明爲指向指向隨機位內存的char的指針。因此,通過line[index++] = c解引用行將直接導致未定義的行爲 - 您正在寫入您不擁有的內存。隨後對getline的調用觸及相同位置的內存並覆蓋之前的內容,這純粹是一種僥倖。

所以你需要改變getline來實際讀入你自己的內存。

一種選擇是將行的聲明更改爲靜態char數組;像。這會給你一些實際的記憶。但是這可以保證每次調用getline時肯定會寫入相同的內存區域。然後,如果需要在下一次調用getline之後保留輸入,則調用者可以將輸入複製到其他位置。

另一種選擇是將getline改爲接受來自調用者的緩衝區,如getline(unsigned char password_mode, char *line, size_t line_size)。這樣你可以將不同的數組傳遞給每個調用。

無論選擇哪一個選項,你也要確保你沒有超出getline中的緩衝區的危險,通過閱讀比你有空間的字符更多的字符。