【发布时间】:2015-10-31 16:41:51
【问题描述】:
我将带键盘的显示器连接到 Raspberry Pi,当我按下一个键时,它会在屏幕上显示该键。我正在使用this 库和this 程序的一部分。
所以我明白这段代码将密钥传递给我的keyboardKey 函数。
if (reply->object == GENIE_OBJ_KEYBOARD)
{
if (reply->index == 0) // Only one keyboard
keyboardKey (reply->data) ;
keyboardKey 函数随后在屏幕上显示键并将值保存到 buf 数组中。
void keyboardKey (int key)
{
char buf[4] ;
int i ;
printf("you typed %c\n",key) ; //shows the typed key in the terminal
sprintf(buf, "%c",key); //transforms the key into a string which is required for using genieWrite
genieWriteStr (1, buf) ; //writes the string to the screen. 1 is the index of the text box
buf[i] = key ; //stores the key in the array
printf("%c\n",buf[0]); //prints the array [0] in the terminal
}
问题是它只显示一个输入。每次按下某个键时,它都会被覆盖,并且文本框仅显示最后一次输入。但我想要的是例如显示一个名字。
因此,我必须将传递给函数的每个键存储到数组中,而不会覆盖之前的任何键。
我知道如何使用scanf 或getchar 从终端存储和打印用户输入,并使用for loops 存储和打印输出,但是我在这里卡住了。我想在最后使用i++,但是i 首先应该获得什么价值?
我可以在 Google 上搜索到任何想法或术语,我很确定这是一个常见问题?
【问题讨论】:
-
buf 字符串是在keyboardKey() 函数中使用还是在该函数之外使用?如果在内部使用,您可以定义一个静态字符串和一个静态 int 索引,该索引最初设置为 0。每次读取一个键时,将其复制到字符串中的第 i 个位置并将 i 移动 1。如果您正在使用buf 在keyboardKey() 函数外,你可能需要在函数外定义字符串,并将字符串作为参数传递给函数。
-
您拥有
char buf[4];并将其用作字符串。 (例如printf("%c\n",buf[0]);)这意味着您最多可以将3字符存储在buf中(保留最后一个buf[3]用于空终止字符0)。您可以使用static int i;导致i在每个函数调用中保留它的最后一个值,从而使您能够在该范围内使用buf作为环形缓冲区(例如,在最后,i++; if (i == 3) i = 0;)。或者,您可以更改返回char keyboardKey (int key)并在返回时存储每个密钥。有很多方法可以解决这个问题。 -
谢谢!这帮助很大!