免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2622 | 回复: 2
打印 上一主题 下一主题

学习《C P L》的新手问题:怎样捕获 backspace 操作? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-20 22:15 |只看该作者 |倒序浏览
本帖最后由 木卫十二 于 2012-06-20 22:17 编辑

《C Programming Language》课后习题1-10:Write a program to copy its input to its output, replacing each tab by \t , each backspace by \b , and each backslash by \\ . This makes tabs and backspaces visible in an unambiguous way.

我参考已有的答案:
  1. /* Gregory Pietsch <gkp1@flash.net> */

  2. #include <stdio.h>

  3. #define ESC_CHAR '\\'

  4. int main(void)
  5. {
  6.   int c;

  7.   while((c = getchar()) != EOF)
  8.   {
  9.     switch(c)
  10.     {
  11.       case '\b':
  12.         /* The OS on which I tested this (NT) intercepts \b characters. */
  13.         putchar(ESC_CHAR);
  14.         putchar('b');
  15.         break;
  16.       case '\t':
  17.         putchar(ESC_CHAR);
  18.         putchar('t');
  19.         break;
  20.       case ESC_CHAR:
  21.         putchar(ESC_CHAR);
  22.         putchar(ESC_CHAR);
  23.         break;
  24.       default:
  25.         putchar(c);
  26.         break;
  27.     }
  28.   }
  29.   return 0;
  30. }
复制代码
然而测试的时候,其他的好说,但是 backspace 怎么也捕获不到,请问怎样操作才能捕获到呢?

论坛徽章:
0
2 [报告]
发表于 2012-06-21 08:51 |只看该作者
backspace的ASCII字符是0x08

论坛徽章:
0
3 [报告]
发表于 2012-06-22 10:03 |只看该作者
本帖最后由 木卫十二 于 2012-06-22 10:44 编辑

Thanks。
问题解决了,贴上新的代码(Linux下gcc调试通过):
  1. #include <stdio.h>
  2. #include <termios.h>
  3. #include <unistd.h>

  4. #define ESC_CHAR '\\'

  5. int mygetch() {
  6.     struct termios oldt,
  7.                    newt;

  8.     int            ch;

  9.         tcgetattr( STDIN_FILENO, &oldt );
  10.         newt = oldt;
  11.         newt.c_lflag &= ~( ICANON | ECHO );
  12.         tcsetattr( STDIN_FILENO, TCSANOW, &newt );
  13.         ch = getchar();
  14.         tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
  15.        
  16.         return ch;
  17. }



  18. int main(void)
  19. {
  20.         int c;
  21.        
  22.         while((c = mygetch()) != EOF  && c != 'q')
  23.         {
  24.         
  25.             switch(c)
  26.                 {
  27.                     /* different keyboard, may have different ascii for backspace */
  28.                         case 127:
  29.                             putchar(ESC_CHAR);
  30.                             putchar('b');
  31.                 putchar('\n');
  32.                             break;
  33.                        
  34.                     /* different keyboard, may have different ascii for backspace */
  35.                         case 8:
  36.                             putchar(ESC_CHAR);
  37.                             putchar('b');
  38.                 putchar('\n');
  39.                             break;
  40.                
  41.                            case 9:
  42.                             putchar(ESC_CHAR);
  43.                             putchar('t');
  44.                 putchar('\n');
  45.                             break;
  46.                
  47.                         case ESC_CHAR:
  48.                             putchar(ESC_CHAR);
  49.                             putchar(ESC_CHAR);
  50.                 putchar('\n');
  51.                             break;
  52.                
  53.                         default:
  54.                             printf("string=%c,ascii=%d.",c,c);
  55.                 putchar('\n');
  56.                             break;
  57.                 }
  58.         }
  59.        
  60.         return 0;
  61. }
  62. $ ./a.out
  63. string=a,ascii=97.
  64. string=i,ascii=105.
  65. \\
  66. \b
  67. \t
复制代码
http://sleepycat.org/c/cpl/chapter1#p2
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP