gpt4 book ai didi

c - C 中的基本键盘处理程序

转载 作者:行者123 更新时间:2023-11-30 15:49:05 28 4
gpt4 key购买 nike

我正在尝试使用汇编和 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 都具有相同的地址?谢谢你的帮助

最佳答案

您的第一个问题是您没有分配任何内存来读取输入。 char* line;将 line 声明为指向 char 的指针,该指针指向内存的随机位。因此通过 line[index++] = c 取消引用行直接带你进入未定义的行为——你正在写入不属于你的内存。随后对 getline 的调用会触及相同的内存位并覆盖之前的内容,这几乎纯粹是侥幸。

因此您需要更改 getline 以实际读取您拥有的内存。

一种选择是将 line 的声明更改为静态字符数组;类似 static char line[100]; 。这会给你一些实际的内存来使用。然而,这保证了每次调用 getline 肯定会写入同一内​​存区域。如果需要在下次调用 getline 之后保留输入,则由调用者将输入复制到其他地方。

另一个选择是更改 getline 以接受来自调用者的缓冲区,例如 getline(unsigned char password_mode, char *line, size_t line_size) 。这样您就可以向每个调用传递不同的数组。

无论您选择哪个选项,您还希望确保不会因读取超出空间的字符而面临溢出 getline 内缓冲区的危险。

关于c - C 中的基本键盘处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16429950/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com