Чтение ввода с клавиатуры

Я делаю тест для более крупной программы, здесь я пытаюсь переместить пробел внутри массива символов, заполненного «*», он работает нормально, но после отправки многих ключей значение левого и правого ключа меняется, я не понимаю, почему

Вот мой код:

include <curses.h>
//#include <term.h>                                                                                              
#include <termios.h>
#include <stdlib.h>
#include "includes/my_list.h"

void                    init_term()
{
  struct termios        term;

  if (tcgetattr(0, &term) != 0)
    {
      printf("Fail to get input termios\n");
      //      return(0);                                                                                         
    }
  term.c_lflag &= ~(ICANON | ECHO);
  term.c_cc[VMIN] = 1;
  term.c_cc[VTIME] = 0;
  if (tcsetattr(0, TCSANOW, &term) != 0)
    {
      printf("Fail to set input termios\n");
      //      return(0);                                                                                         
    }
}

t_info          change_dir(t_info info, int flag)
{
  if(flag == 0)
    info.pos++;
  else if (flag == 1)
    info.pos--;
  info.tab[info.pos] = ' ';
  return(info);
}

int             main()
{
  int           c;
  int           i;  int           pos;
  t_info        info;

  //  tgetent(NULL, "xterm");                                                                                    
  info.tab = malloc(sizeof(*info.tab) * 10);
  i = 0;
  info.pos = 0;
  init_term();
  while (read(0, &c, sizeof(int)) != 0)
    {
      printf("c = %d\n", c);
      //      sleep(1);                                                                                          
      while(i < 9)
        {
          info.tab[i] = '*';
          i++;
        }
      i = 0;
      if(c == 4479771)
        {
          printf("left ok1\n");
          info = change_dir(info, 1);
        }
      else if (c == 4414235)
        info = change_dir(info, 0);
        printf("%s\n", info.tab);
    }
}

person Saxtheowl    schedule 26.10.2013    source источник


Ответы (1)


Я думаю, вы имеете в виду, что info.tab должен быть указателем на строку char, поэтому вы должны иметь
info.tab = malloc(sizeof(char) * 10);

Ваша версия будет выделять больше памяти, необходимой для хранения 10 символов, но это не должно мешать ее работе.

Кроме того, change_dir() может установить индекс в этом массиве за пределами выделенной ему памяти (например, индекс -1), что может иметь ужасные последствия.

person Spalteer    schedule 26.10.2013