3
  • 编译器:gcc 4.5.2
  • 终端:Xterm
  • 操作系统:Linux(x86)
  • Ncurses 5.9

我正在编写一个文本编辑器,它使用 ncurses 以图形方式表示一个数组key_strokes[]。它是一维的,所以我使用宏INDEX(y*maxx+x)指向key_strokes( key_strokes[INDEX]) 中的当前位置。y是函数返回的终端中x的当前坐标,是函数getyx(stdscr, y, x)返回maxx的每一行中的最大列数getmaxyx(stdscr, maxy, maxx)。该程序运行良好,直到我按下退格键,由于某种原因,maxx在它到达下面的开关后,它的值被设置为零。这当然INDEX不会将其限制为仅数组的第一“行”。

用户的击键被捕获为int key_strokes。我使用 switch case 来检查它是否是箭头键、退格键、F12 等INDEX,并maxx定义为,

#define INDEX (y*maxx+x)
unsigned int maxx = 0;

注意我也在使用cbreak(); noecho(); keypad(stdscr, TRUE);.

case KEY_BACKSPACE:
if (INDEX >= 0)
{
   for(i = INDEX; key_strokes[i] != '\0'; i++) {
   key_strokes[i] = key_strokes[i+1];
   }

   if (total_count > 0) {
   total_count--;
   }

   delch();
   if (x == 0) {
   move(y-1, maxx-1);
   }
   else {
   move(y, x-1);
   } refresh();
}
break;
4

2 回答 2

1

确定key_strokes[]是空终止的吗?

因为如果不是,for循环会将内存中的所有内容复制到前一个单元格,直到它达到 0。如果maxxormaxy正好在 0 值之前,它们将被设置为 0。

想象一下以下布局:

| key_strokes[0] | key_strokes[...] |   key_strokes[n] | maxy | maxx | some_other_var |
|            'v' |              'i' | non-null garbage |   23 |   80 |           '\0' |

在“i”之后按退格后,它将是:

| key_strokes[0] | key_strokes[...] |   key_strokes[n] | maxy | maxx | some_other_var |
|            'v' | non-null garbage |               23 |   80 | '\0' |           '\0' |

这也可以解释为什么它在声明为 constmaxy时设置为 0 maxx(GCC 不会将consts 存储在内存中的同一位置)。

为确保它key_strokes[]是空终止的,我建议您将其添加到您的 init 部分:

memset(key_strokes, 0, sizeof(char) * size_of_key_strokes_array);
于 2012-12-07T23:26:52.097 回答
0

我看不到 x 和 y 的类型(即有符号或无符号),但您计算(y 乘以无符号整数并加上 x)似乎很有趣。这个表达式的类型可能是什么?可能这取决于 y 的类型。检查条件是否大于或等于零是否合理?(无符号值始终为零...)

于 2012-12-07T23:25:05.297 回答