[C] Più input sulla stessa riga

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
mechanicus
Linux 0.x
Linux 0.x
Messaggi: 5
Iscritto il: gio 19 feb 2009, 20:33

[C] Più input sulla stessa riga

Messaggio da mechanicus »

Noto con piacere che c'è uno spazio dedicato alla programmazione in generale :D
Bene, il problema è questo: perché scanf accetti un input è necessario premere INVIO; così facendo, però, il cursore va capo. Come fare perché non vada a capo?

P.S.: in tutto il web (così sembra da google) non c'è chi sappia rispondere

Avatar utente
shark1500
Linux 3.x
Linux 3.x
Messaggi: 785
Iscritto il: gio 3 apr 2008, 14:33
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde
Località: Modna

Re: [C] Più input sulla stessa riga

Messaggio da shark1500 »

C'era una cosa tipo getchar se non sbaglio

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] Più input sulla stessa riga

Messaggio da targzeta »

mechanicus ha scritto:...P.S.: in tutto il web (così sembra da google) non c'è chi sappia rispondere
In tutto il web forse ci sono molti che non capiscono che vuoi dire, ma che nessuno che sappia rispondere mi sembra strano :). Cosa vuoi fare? Perchè io sono fra quelli che non ha capito!

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] Più input sulla stessa riga

Messaggio da phobos3576 »

Se non vuoi che il cursore vada a capo, devi scrivere qualche riga di codice C.
Ad esempio, una routine che cattura l'input e fa avanzare il cursore verso destra ogni volta che premi un tasto; quando la routine si accorge che hai premuto Invio, termina la fase di input senza andare a capo.

La funzione scanf non è molto adatta per fare queste cose; puoi usare, ad esempio, la funzione getch().

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] Più input sulla stessa riga

Messaggio da targzeta »

phobos3576 ha scritto:...La funzione scanf non è molto adatta per fare queste cose; puoi usare, ad esempio, la funzione getch().
Non è così semplice, si deve modificare il comportamento del terminale, in questi casi si dovrebbero usare le curses.

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

mechanicus
Linux 0.x
Linux 0.x
Messaggi: 5
Iscritto il: gio 19 feb 2009, 20:33

Re: [C] Più input sulla stessa riga

Messaggio da mechanicus »

spina ha scritto:
mechanicus ha scritto:...P.S.: in tutto il web (così sembra da google) non c'è chi sappia rispondere
In tutto il web forse ci sono molti che non capiscono che vuoi dire, ma che nessuno che sappia rispondere mi sembra strano :). Cosa vuoi fare? Perchè io sono fra quelli che non ha capito!
Cfr.
- http://www.p2pforum.it/forum/showthread ... d&t=276765
- http://www.hardforum.com/showthread.php?p=1033218576
sono post non miei, in linea da mesi, senza risposta.

Ad ora sto valutando una soluzione basata su getchar, sebbene confidassi in una più bell'e pronta.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] Più input sulla stessa riga

Messaggio da targzeta »

mechanicus ha scritto:...Ad ora sto valutando una soluzione basata su getchar, sebbene confidassi in una più bell'e pronta.
La soluzione bell'è pronta sono le curses :D

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

mechanicus
Linux 0.x
Linux 0.x
Messaggi: 5
Iscritto il: gio 19 feb 2009, 20:33

Re: [C] Più input sulla stessa riga

Messaggio da mechanicus »

le curses... so cosa sono, nulla più. pensavo di aggiungerle, forse, in un secondo momento (ma anche no).
comunque, puoi farmi un esempio?

P.S.: getchar non va.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] Più input sulla stessa riga

Messaggio da targzeta »

mechanicus ha scritto:le curses... so cosa sono, nulla più. pensavo di aggiungerle, forse, in un secondo momento (ma anche no).
comunque, puoi farmi un esempio?

P.S.: getchar non va.
Te l'ho detto che non era così semplice, è il terminale che devi modificare. Un esempio? Ad esempio potresti leggerti il manuale delle curses :D.

Spina

P.S. Per inciso, c'è almeno un altra soluzione, usare le termios(3), ma non so perchè mi hanno sempre consigliato le curses...forse perchè termios è conforme solo allo standard POSIX?
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C] Più input sulla stessa riga

Messaggio da Blizzard »

se vuoi dai un'occhiata a questo
http://santostefanogiovanni.blogspot.co ... linux.html
l'ho scritto con le curses (o meglio ncurses).

muove il cursore in ogni dove quindi è abbastanza esplicativo.

Se non vuoi usare librerie, fammi pensare, si è "tosta" .

ciao
Giovanni

mechanicus
Linux 0.x
Linux 0.x
Messaggi: 5
Iscritto il: gio 19 feb 2009, 20:33

Re: [C] Più input sulla stessa riga

Messaggio da mechanicus »

Grazie a tutti per le vostre risposte; tuttavia mi pentirei di non aver fatto un ultimo tentativo.
C'è nessuno che sa come alternare, in C, input e output sulla stessa riga di terminale usando la sola libreria standard?
Grazie, ciao

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] Più input sulla stessa riga

Messaggio da targzeta »

Vabbuò :(, si è capito che sei un cattivo studente. Questo è un mio vecchio esempio usando la termios, di come puoi prelevare l'input dell'utente senza aspettare che esso prema "enter", e quindi di analizzarlo prima di stamparlo in output.

Codice: Seleziona tutto

/*
 * Questo e' un esempio di un programma che legge 5 caratteri dall'input
 * e gli analizza prima di stamparli sul terminale, in questo esempio
 * i newline non vengono inviate cossicché anche se l'utente preme
 * invio, il programma non va a capo.
 */

#include <stdio.h>
#include <string.h>
#include <termios.h>

int main ()
{
  int i, a;
  struct termios new, old;

  tcgetattr(0,&old); /* Prelevo il settaggio corrente */

  memcpy(&new, &old, sizeof(struct termios));

  new.c_lflag &= ~(ICANON | ECHO); /* Disabilito il modo canonico e l'echo */
 
  new.c_cc[VMIN]=1; /* Setto il minimo numero di caratteri a 1 */

  tcsetattr(0,TCSANOW,&new); /* Setto il nuovo termios, subito(TCSANOW) */

  for ( i = 0; i < 5; i++ )
    {
      a=getchar(); /* Prelevo un carattere dall'input standard */
      if ( a != '\n')
       putchar(a);
    }

  tcsetattr(0,TCSANOW, &old);  /* Ripristino i settaggi originali */
  
  return 0;
}
Un buon studente, dopo che uno gli da le indicazioni per risolvere il problema, le ricerche se le fa da solo :D

Spina

P.S. Ora spero che almeno stampare l'output sulla stessa riga ci arriverai da solo a farlo :)
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi