Suggerimento per esercizio

di il
10 risposte

Suggerimento per esercizio

Ciao a tutti ,

vorrei qualche consiglio per questo esercizio:

si scriva un programma i cui dati in uscita replichino i dati in ingresso, sostituendo i caratteri di tabulazione con \t, ogni backspace con \b e ogni barra inversa con \\, così da rendere perfettamente visibili le tabulazioni e le cancellazioni.

Il mio codice è in calce, però:
1) il backspace non funziona ...
2) ho dovuto usare il valore del codice ascii (92), perchè mi dava un errore se usavo
putchar(' \');

per il resto mi sembra che giri giusto.
Vi sarei grato se oltre a darmi suggerimenti sui punti 1 e 2, mi poteste dare indicazioni
su come, se possibile, perfezionare il codice.
// sostituzione di tabulazione -> /t, backspace -> /b, "\" con -> \\

#include <stdio.h>

main()
{
 int c=0;
 
 while( (c=getchar()) != '?')
 {
        if( c == '\t'){
           putchar(92);
           putchar('t');
           }
        else if( c == '\b'){
           putchar(92);
           putchar('b');
           }
        else if( c == 't'){
           putchar(92);
           putchar(92);
           }
        else putchar(c);
 }
 fflush(stdin);
 getchar();
      
}         
Grazie

10 Risposte

  • Re: Suggerimento per esercizio

    Con la getchar non puoi lavorare correttamente perché è bufferizzata e il backspace viene intercettato ...

    Se il compilatore supporta l'header conio.h allora ti consiglio di usare la getch, quindi

    aggiungi

    #include <conio.h>

    il ciclo diventa

    while( (c=getch()) != '?')

    e per la if del backspace basta raddoppiare il carattere così

    else if( c == '\\'){
  • Re: Suggerimento per esercizio

    Ciao oregon,

    grazie per la dritta, se posso romperti ancora volevo sapere:

    1) puoi darmi qualche altra info rispetto a quando dici
    "...la getchar non puoi lavorare correttamente perché è bufferizzata..." ?

    2) giusto per sicurezza, il backspace è pulsante sopra il retur, ovvero quello che cancella l'ultimo
    carattere. Per quest'evento ancora non ci siamo.
    Quando lo digito il cursore torna indietro di uno, ma ne cancella il carattere su cui arriva, ne lo sostituisce con /b.

    Grazie
  • Re: Suggerimento per esercizio

    xGiove ha scritto:


    "...la getchar non puoi lavorare correttamente perché è bufferizzata..." ?
    Con il backspace la getchar elimina l'ultimo carattere dal buffer ma non restituisce il codice del backspace stesso.
    il backspace è pulsante sopra il retur
    Sì, sopra il return ...
    Per quest'evento ancora non ci siamo.
    Ma con quale codice?
  • Re: Suggerimento per esercizio

    Hai ragione, scusami, funziona tutto correttamente.
    Cmq lo posto in calce.

    Se hai voglia rispondimi ancora a un paio di dubbi, altrimenti pazienza, sei stato STRA gentile
    oltre che esaustivo.

    1) Perchè se digito il return porta il cursore all'inizio della riga ?

    2) Come mai vengo visualizzati caratteri strani se digito le frecce direzionali ?

    3) Perchè se cambio la condizione di uscita
    while( (c=getch()) != '?')
    in
    while( (c=getch()) != EOF)
    il ctrl+z non funziona ?

    Ancora grazie !

    // sostituzione di tabulazione -> /t, backspace -> /b, "\" con -> \\
    
    #include <stdio.h>
    #include <conio.h> 
    
    main()
    {
     int c=0;
     
     while( (c=getch()) != '?') //uso getch come da tuo suggerimento
     {
            if( c == '\t'){
               putchar(92);
               putchar('t');
               }
            else if( c == '\b){
               putchar(92);
               putchar('b');
               }
            else if( c == '\\'){
               putchar(92);
               putchar(92);
               }
            else putchar(c);
     }
     fflush(stdin);
     getchar();
          
    }         
  • Re: Suggerimento per esercizio

    xGiove ha scritto:


    1) Perchè se digito il return porta il cursore all'inizio della riga ?
    2) Come mai vengo visualizzati caratteri strani se digito le frecce direzionali ?
    [/code]

    In questi casi viene eseguita la linea finale

    else putchar(c);

    e quindi visualizzato il carattere corrispondente al codice ASCII di c.

    Il codice del tasto Return viene "interpretato" come comando di ritorno a capo e le freccette hanno codici ASCII minori di 32 che vengono visualizzati come caratteri associati alla tabella ASCII.
    In pratica, se studi un po' di ASCII comprendi meglio ...
    3) Perchè se cambio la condizione di uscita
    La getch non restituisce il valore EOF (che è -1) ma il valore del codice ASCII ... per ctrl-z è 26 (ovvero 1a esadecimale) quindi dovrai scrivere

    while( (c=getch()) != 0x1a)
  • Re: Suggerimento per esercizio

    Fantastico !! Ti devo almeno un paio di birre

    Buona giornata
  • Re: Suggerimento per esercizio

    Scusa oregon,

    rileggendo l'ultimo post mi è venuto un dubbio riguardo l'EOF.
    (Mi sono riguardato la tabella ASCII come mi hai suggerito.)

    Sulla condizione
    while( (c=getch()) != EOF)
    tutto ok,
    ma sulla condizione
    while( (c=getchar()) != EOF)
    non ci sono.

    Nella normale digitazione di qualsiasi carattere, visto che la tabella ascii va da 0 a 127, "c" non dovrebbe avere mai il valore -1, anche nel caso in cui nella shell scrivessi una serie
    di caratteri es "dsadksj-1". Dopo l'invio il compilatore interpreta "-" come un carattere e "1" come
    un altro carattere per cui non ho modo di assegnare quel valore.
    Però, se dopo l'inserimento di una stringa a caso, digito il fantomatico ctrl+z,
    visualizzo ^Z e non cambia nulla !
    Se invece lo faccio dopo essere andato a capo, si attiva la condizione di uscita del while.
    Perchè ?

    Questo EOF mi stà facendo perdere un sacco di tempo..

    Grazie
  • Re: Suggerimento per esercizio

    In realtà il valore restituito è un int e quindi può essere -1
  • Re: Suggerimento per esercizio

    Ok, però perchè funziona solo dopo essere andati a capo ?
  • Re: Suggerimento per esercizio

    Te l'ho detto prima ... perché la getchar è bufferizzata (per cui i problemi) ...

    Ovvero la funzione lavora con un buffer e termina solo quando usi il return
Devi accedere o registrarti per scrivere nel forum
10 risposte