【问题标题】:How to store user input in an array without a for loop in cc - 如何在没有for循环的情况下将用户输入存储在数组中
【发布时间】: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
}

问题是它只显示一个输入。每次按下某个键时,它都会被覆盖,并且文本框仅显示最后一次输入。但我想要的是例如显示一个名字。

因此,我必须将传递给函数的每个键存储到数组中,而不会覆盖之前的任何键。

我知道如何使用scanfgetchar 从终端存储和打印用户输入,并使用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) 并在返回时存储每个密钥。有很多方法可以解决这个问题。
  • 谢谢!这帮助很大!

标签: c arrays for-loop


【解决方案1】:

不太确定您要完成什么。无论如何,如果您想在每次调用 keyboardKey 时存储缓冲区的状态,您可以将其声明为静态,如下所示:

#define BUF_SIZE 4

void keyboardKey(int key) {
  static char buf[BUF_SIZE];
  static int  i = 0;

  if(i > ((int)sizeof(buf) - 2)) {
    i = 0;
    memset(buf, 0, sizeof(buf));
  }

  printf("you typed %c\n",key);
  buf[i] = key; 

  genieWriteStr (1, buf);

  buf[i++] = key;
  printf("%s\n",buf);
}

LIVE DEMO

【讨论】:

  • 行得通,非常感谢!但是您能解释一下或者将网站发布到教程中吗?这条线是什么意思(int)sizeof(buf) - 2)?为什么-2
  • @PaulBernhardWagner 您有一个包含 N 个元素(即N = sizeof(buf))的缓冲区,\0 终止字符的 -1 个元素,以便将您的缓冲区解释为有效字符串,您有剩下 N - 1 个可用元素。现在 C 从 0 开始计数,因此索引 i 必须从序列 {0, 1, 2, ..., N - 2} 中获取值。因此,当索引达到大于N - 2 的值时,必须重置缓冲区以及相关索引。这就是-2的原因。希望能为您解决问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2021-11-18
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多