开发者社区> 问答> 正文

《linux程序设计》中一个例题的疑问 400 请求报错 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
#include <term.h>
#include <curses.h>

static FILE *output_stream = (FILE *)0;

char *menu[] = {
  "a - add new record",
  "d - delete record",
  "q - quit",
  NULL};

int getchoice(char *grreet, char *choices[], FILE *in, FILE *out);
int char_to_terminal(int char_to_write);

int main()
{
  char choice = 0;
  FILE *input;
  FILE *output;
  struct termios initial_settings, new_settings;

  if(!isatty(fileno(stdout)))
     {
	fprintf(stderr, "You are not a terminal, OK.\n"); 	
     }

  input = fopen("/dev/tty", "r");
  output = fopen("/dev/tty", "w");
  if(!input || !output)
    {
      fprintf(stderr, "Unable to open /dev/tty\n");
      exit(1);
    }

  tcgetattr(fileno(input), &initial_settings);
  new_settings = initial_settings;
  new_settings.c_lflag &= ~ICANON;
  new_settings.c_lflag &= ~ECHO;
  new_settings.c_cc[VMIN] = 1;
  new_settings.c_cc[VTIME] = 0;
  new_settings.c_lflag &= ~ISIG;
  if(tcsetattr(fileno(input), TCSANOW, &new_settings))
     fprintf(stderr, "Could not set attributes\n");

  do
    {
      choice = getchoice("Please select an action", menu, input, output);
      fprintf(output, "You have chosen: %c\n", choice);
      sleep(1);
    }while(choice != 'q');

  tcsetattr(fileno(input), TCSANOW, &initial_settings);
  exit(0);
}

int getchoice(char *greet, char *choices[], FILE *in, FILE *out)
{
  int chosen = 0;
  char selected;
  int screenrow, screencol = 10;
  char **option;
  char *cursor, *clear;

  output_stream = out;

  setupterm(NULL, fileno(out), (int *)0);
  cursor = tigetstr("cup");
  clear = tigetstr("clear");

  screenrow = 4;
  tputs(clear, 1, char_to_terminal);
  tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
  fprintf(out, "Choice:%s", greet);
  screenrow += 2;
  option = choices;
  while(*option)
    {
      tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
      fprintf(out, "%s", *option);
      screenrow++;
      option++;
    }
  fprintf(out, "\n请输入:");

  do
    {
      fflush(out);
      selected = fgetc(in);
      option = choices;
      while(*option)
	{
	  if(selected == *option[0])
	    {
	      chosen = 1;
	      break;
	    }
	  option++;
	}

      if(!chosen)
	{
	  tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
	  fprintf(out, "Incorrect choice, select again\n");
	}
    }while(!chosen);
  tputs(clear, 1, char_to_terminal);
  return selected;
}

int char_to_terminal(int char_to_write)
{
  if (output_stream)
    putc(char_to_write, output_stream);
  return 0;
}
如果在main函数中的
do
    {
      choice = getchoice("Please select an action", menu, input, output);
      fprintf(output, "You have chosen: %c\n", choice);
      sleep(1);
    }while(choice != 'q');

循环中不加入sleep(1); 这条语句 那么在程序键入a或d(键入q正常),程序判断报错,且对环境的这两条  

new_settings.c_cc[VMIN] = 1;

  new_settings.c_cc[VTIME] = 0;语句没有起效,还是需要输入回车,还有,在gdb调试中,运行也是正常的。表达能力不好,敬请谅解。谢谢各位了。
环境:ubuntu+gcc

展开
收起
kun坤 2020-05-29 09:52:12 490 0
1 条回答
写回答
取消 提交回答
  • 各位高手,路过的随意提点一下。谢谢了######有没人肯帮助一下。。谢谢啦######求解答。。。######你就不能把程序简化一下吗,这么长,换谁都不高兴看下去。。。

    2020-05-29 11:39:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载