免费注册 查看新帖 |

Chinaunix

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

编译总是出错,怀疑指针有问题,就是弄不明白 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-04 08:09 |只看该作者 |倒序浏览
写了一段代码,做一个小的编辑器,其中一个函数处理编辑,接受键盘输入,并编辑显示:


  1. int cio_edit(char *str, int row, int col, int flen, int slen,int *ins, int *curpos, int *spos, int isMultiLine){
  2.         //Check the variables
  3.         int ch;
  4.         if (!(*ins == 0||*ins == 1)){
  5.                 (*ins) = 0;
  6.         }
  7.         if (*spos < 0){
  8.                 (*spos) =0;
  9.         }
  10.         if( *spos > (int)strlen(str)){
  11.                 (*spos) = (int)strlen(str);
  12.         }
  13.         if(*curpos > flen){
  14.         (*curpos) = *spos + flen;
  15.         }
  16.         if (*curpos < 0){
  17.                 (*curpos) = 0;
  18.         }

  19.         //Check done

  20.         //process editing  with Multiline or not
  21.         if (isMultiLine==0){
  22.                 ch = singleLine(str,row,col,flen,slen,ins,curpos,spos);
  23.         }else{
  24.         ch = multiLine(str,row,col,flen,slen,ins,curpos,spos);
  25.         }
  26. return ch;
  27. }

  28. int singleLine(char *str, int row, int col, int flen, int slen,int *ins, int *curpos, int *spos){
  29.   int
  30.     ch,
  31.     done = 0,
  32.     i;

  33.   char
  34.         *temp;

  35.   try {
  36.           temp = new char[slen];
  37. }catch (bad_alloc x){
  38.           done=1;
  39.           ch=-1;
  40. }
  41.   strcpy(temp,str);
  42.   
  43.   while(!done){
  44.     cio_display(temp + *spos, row, col ,flen);
  45.     cio_cursor(row,col + *curpos);
  46.     ch = cio_getch();
  47.     switch(ch){
  48.                 case INS_KEY:
  49.                         *ins=(ins==0)? 1:0;
  50.                 break;
  51.                 case UP_KEY:
  52.                         done=1;
  53.                 break;
  54.                 case DOWN_KEY:
  55.                         done=1;
  56.                 break;
  57.                 case TAB_KEY:
  58.                         done=1;
  59.                 break;
  60.                 case ESC_KEY:
  61.                         done=2;
  62.                 break;
  63.         case ENTER_KEY:
  64.                         done = 1;
  65.             break;
  66.                 case PGUP_KEY:
  67.                         done=1;
  68.                 break;
  69.                 case PGDN_KEY:
  70.                         done=1;
  71.                 break;
  72.                 case HOME_KEY:
  73.                     *spos = *curpos = 0;
  74.         break;
  75.             case END_KEY:
  76.                     *spos = *curpos = slen;
  77.         break;
  78.                 case DEL_KEY:
  79.         for(i=*curpos+*spos;temp[i];i++){
  80.           temp[i] = temp[i+1];
  81.         }
  82.         break;
  83.                 case BS_KEY:
  84.                 for(i=*curpos+*spos;temp[i];i++){
  85.           temp[i-1] = temp[i];
  86.                 }
  87.                 break;
  88.                 case RIGHT_KEY:
  89.                         if((*spos + *curpos) < (int)strlen(temp)){
  90.                                 if(*curpos < flen -1){
  91.                                         (*curpos)++;
  92.                                 }
  93.                                 else{
  94.                                         (*spos)++;
  95.                                 }
  96.                         }
  97.         break;
  98.                 case LEFT_KEY:
  99.                         if( *curpos > 0){
  100.                                 (*curpos)--;
  101.                         }
  102.         break;
  103.                 default:{
  104.                         if(ch>=' ' && ch <='~'){    /* if printable */
  105.                                 if((int)strlen(temp) < slen  &&  *ins == 1){     //have place and not ins
  106.                                         if(str[*spos + *curpos] == 0){      //check the end of str
  107.                                                 str[*spos + *curpos + 1] = 0;   //and move the terminated forward
  108.                                         }
  109.                                         str[*spos + *curpos] = ch;         
  110.                                         if(*curpos < flen -1){              //move cursor forward
  111.                                                 (*curpos)++;
  112.                                         }
  113.                                         else{
  114.                                                 (*spos)++;
  115.                                         }
  116.                                 }
  117.                         }
  118.                         else{
  119.                                 if(!*ins){
  120.                                         str[*spos + *curpos] = ch;
  121.                                 }
  122.                         }
  123.                 }
  124.         } //switch end
  125.         } // while end
  126.         if(done=1){
  127.                 strcpy(str,temp);
  128.         }
  129.         delete *temp;

  130.         return ch;
  131. }


  132. int multiLine(char *str, int row, int col, int flen, int slen,int *ins, int *curpos, int *spos){
  133.   int
  134.     ch,
  135.     done = 0,
  136.     i,
  137.         line=0;
  138.    
  139.   while(!done){
  140.           //display all lines
  141.         while(line<slen/flen){
  142.                 cio_display((str + (*spos + flen*line)), row+line,col ,flen);
  143.                 line++;
  144.         }
  145.         cio_cursor(row+line,col + (*curpos%flen));
  146.     ch = cio_getch();

  147.     switch(ch){
  148.                 case INS_KEY:
  149.                         *ins=(ins==0)? 1:0;
  150.                 break;
  151.                 case UP_KEY:
  152.                         done=1;
  153.                 break;
  154.                 case DOWN_KEY:
  155.                         done=1;
  156.                 break;
  157.                 case TAB_KEY:
  158.                         if(((int)strlen(str) + TAB_SIZE) < slen  &&  *ins == 1){
  159.                                 for(i=0;i<TAB_SIZE;i++){                                       
  160.                                         str[*spos + *curpos] = ' ';  
  161.                                 }        
  162.                                 if(*curpos + TAB_SIZE < flen -1){              //move cursor forward
  163.                                         (*curpos)++;
  164.                                 }else{
  165.                                         (*spos)++;
  166.                                 }
  167.                         }                       
  168.                 break;
  169.                 case ESC_KEY:
  170.                         done=1;
  171.                 break;
  172.         case ENTER_KEY:
  173.                         done = 1;
  174.             break;
  175.                 case PGUP_KEY:
  176.                         done=1;
  177.                 break;
  178.                 case PGDN_KEY:
  179.                         done=1;
  180.                 break;
  181.             case HOME_KEY:
  182.                     *spos = *curpos = 0;
  183.         break;
  184.                 case DEL_KEY:
  185.         for(i=*curpos+*spos;str[i];i++){
  186.           str[i] = str[i+1];
  187.         }
  188.         break;
  189.                 case BS_KEY:
  190.                 for(i=*curpos+*spos;str[i];i++){
  191.           str[i-1] = str[i];
  192.                 }
  193.                 break;
  194.                 case RIGHT_KEY:
  195.                         if((*spos + *curpos) < (int)strlen(str)){
  196.                                 if(*curpos < flen -1){
  197.                                         (*curpos)++;
  198.                                 }
  199.                                 else{
  200.                                         (*spos)++;
  201.                                 }
  202.                         }
  203.         break;
  204.                 default:{
  205.                         if(ch>=' ' && ch <='~'){    /* if printable */
  206.                                 if((int)strlen(str) < slen  &&  *ins == 1){     //have place and not ins
  207.                                         if(str[*spos + *curpos] == 0){      //check the end of str
  208.                                                 str[*spos + *curpos + 1] = 0;   //and move the terminated forward
  209.                                         }
  210.                                         str[*spos + *curpos] = ch;         
  211.                                         if(*curpos < flen -1){              //move cursor forward
  212.                                                 (*curpos)++;
  213.                                         }else{
  214.                                                 (*spos)++;
  215.                                         }
  216.                                 }
  217.                         }else{
  218.                                 str[*spos + *curpos] = ch;
  219.                         }
  220.                 }
  221.         } //switch end
  222.         } // while end
  223.   return ch;
  224. }
复制代码


输入一个str,spos指向需要编辑的起始字符,curpos是当前光标,ins表示插入状态,flen是行宽,slen是字符串最大长度,col/row表示显示字符串的起始位置

编译的时候有时能过,有时不能,运行就出错,查来查去,似乎是指针有问题,但是却不知道到底出了什么问题

偶是在VC下编译运行的

多谢多谢,大虾们指点指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP