- 论坛徽章:
- 0
|
写了一段代码,做一个小的编辑器,其中一个函数处理编辑,接受键盘输入,并编辑显示:
- int cio_edit(char *str, int row, int col, int flen, int slen,int *ins, int *curpos, int *spos, int isMultiLine){
- //Check the variables
- int ch;
- if (!(*ins == 0||*ins == 1)){
- (*ins) = 0;
- }
- if (*spos < 0){
- (*spos) =0;
- }
- if( *spos > (int)strlen(str)){
- (*spos) = (int)strlen(str);
- }
- if(*curpos > flen){
- (*curpos) = *spos + flen;
- }
- if (*curpos < 0){
- (*curpos) = 0;
- }
- //Check done
- //process editing with Multiline or not
- if (isMultiLine==0){
- ch = singleLine(str,row,col,flen,slen,ins,curpos,spos);
- }else{
- ch = multiLine(str,row,col,flen,slen,ins,curpos,spos);
- }
- return ch;
- }
- int singleLine(char *str, int row, int col, int flen, int slen,int *ins, int *curpos, int *spos){
- int
- ch,
- done = 0,
- i;
- char
- *temp;
- try {
- temp = new char[slen];
- }catch (bad_alloc x){
- done=1;
- ch=-1;
- }
- strcpy(temp,str);
-
- while(!done){
- cio_display(temp + *spos, row, col ,flen);
- cio_cursor(row,col + *curpos);
- ch = cio_getch();
- switch(ch){
- case INS_KEY:
- *ins=(ins==0)? 1:0;
- break;
- case UP_KEY:
- done=1;
- break;
- case DOWN_KEY:
- done=1;
- break;
- case TAB_KEY:
- done=1;
- break;
- case ESC_KEY:
- done=2;
- break;
- case ENTER_KEY:
- done = 1;
- break;
- case PGUP_KEY:
- done=1;
- break;
- case PGDN_KEY:
- done=1;
- break;
- case HOME_KEY:
- *spos = *curpos = 0;
- break;
- case END_KEY:
- *spos = *curpos = slen;
- break;
- case DEL_KEY:
- for(i=*curpos+*spos;temp[i];i++){
- temp[i] = temp[i+1];
- }
- break;
- case BS_KEY:
- for(i=*curpos+*spos;temp[i];i++){
- temp[i-1] = temp[i];
- }
- break;
- case RIGHT_KEY:
- if((*spos + *curpos) < (int)strlen(temp)){
- if(*curpos < flen -1){
- (*curpos)++;
- }
- else{
- (*spos)++;
- }
- }
- break;
- case LEFT_KEY:
- if( *curpos > 0){
- (*curpos)--;
- }
- break;
- default:{
- if(ch>=' ' && ch <='~'){ /* if printable */
- if((int)strlen(temp) < slen && *ins == 1){ //have place and not ins
- if(str[*spos + *curpos] == 0){ //check the end of str
- str[*spos + *curpos + 1] = 0; //and move the terminated forward
- }
- str[*spos + *curpos] = ch;
- if(*curpos < flen -1){ //move cursor forward
- (*curpos)++;
- }
- else{
- (*spos)++;
- }
- }
- }
- else{
- if(!*ins){
- str[*spos + *curpos] = ch;
- }
- }
- }
- } //switch end
- } // while end
- if(done=1){
- strcpy(str,temp);
- }
- delete *temp;
- return ch;
- }
- int multiLine(char *str, int row, int col, int flen, int slen,int *ins, int *curpos, int *spos){
- int
- ch,
- done = 0,
- i,
- line=0;
-
- while(!done){
- //display all lines
- while(line<slen/flen){
- cio_display((str + (*spos + flen*line)), row+line,col ,flen);
- line++;
- }
- cio_cursor(row+line,col + (*curpos%flen));
- ch = cio_getch();
- switch(ch){
- case INS_KEY:
- *ins=(ins==0)? 1:0;
- break;
- case UP_KEY:
- done=1;
- break;
- case DOWN_KEY:
- done=1;
- break;
- case TAB_KEY:
- if(((int)strlen(str) + TAB_SIZE) < slen && *ins == 1){
- for(i=0;i<TAB_SIZE;i++){
- str[*spos + *curpos] = ' ';
- }
- if(*curpos + TAB_SIZE < flen -1){ //move cursor forward
- (*curpos)++;
- }else{
- (*spos)++;
- }
- }
- break;
- case ESC_KEY:
- done=1;
- break;
- case ENTER_KEY:
- done = 1;
- break;
- case PGUP_KEY:
- done=1;
- break;
- case PGDN_KEY:
- done=1;
- break;
- case HOME_KEY:
- *spos = *curpos = 0;
- break;
- case DEL_KEY:
- for(i=*curpos+*spos;str[i];i++){
- str[i] = str[i+1];
- }
- break;
- case BS_KEY:
- for(i=*curpos+*spos;str[i];i++){
- str[i-1] = str[i];
- }
- break;
- case RIGHT_KEY:
- if((*spos + *curpos) < (int)strlen(str)){
- if(*curpos < flen -1){
- (*curpos)++;
- }
- else{
- (*spos)++;
- }
- }
- break;
- default:{
- if(ch>=' ' && ch <='~'){ /* if printable */
- if((int)strlen(str) < slen && *ins == 1){ //have place and not ins
- if(str[*spos + *curpos] == 0){ //check the end of str
- str[*spos + *curpos + 1] = 0; //and move the terminated forward
- }
- str[*spos + *curpos] = ch;
- if(*curpos < flen -1){ //move cursor forward
- (*curpos)++;
- }else{
- (*spos)++;
- }
- }
- }else{
- str[*spos + *curpos] = ch;
- }
- }
- } //switch end
- } // while end
- return ch;
- }
复制代码
输入一个str,spos指向需要编辑的起始字符,curpos是当前光标,ins表示插入状态,flen是行宽,slen是字符串最大长度,col/row表示显示字符串的起始位置
编译的时候有时能过,有时不能,运行就出错,查来查去,似乎是指针有问题,但是却不知道到底出了什么问题
偶是在VC下编译运行的
多谢多谢,大虾们指点指点 |
|