2017-07-06 6 views
0

J'essaye d'implémenter un programme de console qui a la fonctionnalité de retour arrière. La console accepte un certain nombre de commandes valides que j'ai définies. Exemple:Comment effacer le dernier caractère de la console en utilisant le retour arrière, sans utiliser l'espace char?

Entrée:

enter image description here

Sortie:

enter image description here

J'utilise une instruction switch, qui vérifie le caractère courant retourné par getchar().

switch (inChar) 
    { 
     case '\r': 
     case '\n': 
     { 
      ... 
     } 

     case 0x18:      // ^x 
     { 
      ... 
     } 

     case 0x08:      // backspace 
     { 
      printf("\b \b"); 
      break; 
     } 

     default: 
     { 
      inBuffer[inBufIndx++] = inChar; 
      inBuffer[inBufIndx] = 0; 
      printf("%c", inChar);  // echo character 
     } 
    } 

Le code ci-dessus donne l'impression d'effacer le caractère, mais place un espace char. Cela fonctionne pour la plupart des cas, tels que l'effacement du o de helo mais ne fonctionne pas lors de l'effacement du o off helpo. Mon shell ne peut plus interpréter la commande en raison du caractère espace qui est imprimé à la place de la o

Comment puis-je implémenter le retour arrière pour les caractères à la fin de l'entrée qui doit être effacé?

EDIT: rici est exactement exact. Je ne supprimais pas le personnage que j'avais effacé dans la console de mon inBuffer. Le code ci-dessous a donné la fonctionnalité désirée.

 case 0x08: 
     { 
      printf("\b \b"); 
      inBuffer[inBufIndx--] = NULL; 
      break; 
     } 
+0

Pourquoi se 'printf ("\ b")' ne suffit pas? –

+0

J'ai essayé 'printf ("/b ")', mais cela a simplement déplacé le curseur d'un caractère et n'a pas effacé le caractère indésirable. Le code ci-dessus déplace le curseur vers l'arrière, imprime un espace sur le caractère indésirable, puis recule le curseur pour que je puisse réécrire sur l'espace. –

+0

Il semble que vous deviez supprimer les espaces de fin des chaînes de commande avant de tenter de les exécuter. –

Répondre

0

Vraisemblablement, vous devez supprimer le caractère de inBuffer (par décrémentation inBufIdx et le caractère ancien écrasant avec un 0). Ce que l'écran montre ne devrait pas être pertinent.

Par ailleurs, la séquence backspace backspace-espace ne fonctionnera pas à la marge de droite