Pagina 1 di 1

C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 18:33
da TonT
Ciao a tutti!

Allora ho un Menu del tipo

Codice: Seleziona tutto

   printf("\t\t\t** Menu **\n\n");
   printf("\t\t\t1) Funzione 1\n");
   printf("\t\t\t2) Funzione 2\n");
   printf("\t\t\t3) ........\n");
   printf("\t\t\t4) .......\n\n");
   printf("\t\t\t   Scelta: ");
     do {
      scanf("%d",&scelta);
   } while ( (scelta < 1) || (scelta > 4) );
vado ad effettuare un controllo sulla variabile scelta e dico se è di 4 devo ripetere la scelta .. il problema è che se inserisco un numero ( al di fuori dell 'intervallo ) do invio  il cursore della shell va in basso...ecco, volevo sapere se c'è una funzione che mi permetta di ri-posizionare il cursore sempre davanti la stringa "Scelta: "  o se esiste un altro modo per fare questa cosa...
grazie!

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 18:36
da christian88
prova così, dovrebbe funzionare se non sbaglio:

Codice: Seleziona tutto

#include<stdio.h>
#include<conio.h>
int scelta;
main()
{do{
   printf("\t\t\t** Menu **\n\n");
   printf("\t\t\t1) Funzione 1\n");
   printf("\t\t\t2) Funzione 2\n");
   printf("\t\t\t3) ........\n");
   printf("\t\t\t4) .......\n\n");
   printf("\t\t\t   Scelta: ");
      scanf("%d",&scelta);
   } while ( scelta < 1 || scelta > 4 );
getch();
}

sono un po' arrugginito sul C  >:( ma credo che così funzioni... (yes)

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 18:44
da TonT
hum..no  :D
cmq getch() non è una funzione standard e la libreria conio.h su linux non esiste ( mi sembra)

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 18:45
da christian88
infatti, ti avevo avvisato che ero un po' arrugginito  ;D scusa se ti ho fatto perdere tempo  :-[

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 18:46
da TonT
no no tranquillo (b2b)

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 21:41
da Berghem
premesso che non so come si faccia, ma avendo lo stesso problema devi agire più o menu cosi;
1) fai una funzione menu
2)alla prima istruzion del menu piazzi system("clear");, ti serve per pulire lo schermo
3) se la scelta è 4 richiami la funzione menu

Credo che cosi funzioni e risolvi il tuo problema, poi credo che chiederai cmq come rispostare il cursore.....

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 21:52
da menelicte
Esatto!
Puoi fare così:

Codice: Seleziona tutto

   do {
	system("clear");
	printf("\t\t\t** Menu **\n\n");
	printf("\t\t\t1) Funzione 1\n");
	printf("\t\t\t2) Funzione 2\n");
	printf("\t\t\t3) ........\n");
	printf("\t\t\t4) .......\n\n");
	printf("\t\t\t   Scelta: ");
        scanf("%d",&scelta);
   } while ( (scelta < 1) || (scelta > 4) );
non ho trovato alternative "standard"

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 21:57
da edgy
come ti hanno già detto puoi usare il comando system("clear") che cancella la videata

Codice: Seleziona tutto

#include <stdio.h>

void stampa_menu (void)
{
	printf("\t\t\t** Menu **\n\n");
	printf("\t\t\t1) Funzione 1\n");
	printf("\t\t\t2) Funzione 2\n");
	printf("\t\t\t3) ........\n");
	printf("\t\t\t4) .......\n\n");
	printf("\t\t\t   Scelta: ");
}

int main(void)
{
	int scelta;
	do {
		stampa_menu();
		scanf("%d",&scelta);
		system("clear");
	} while ( (scelta < 1) || (scelta > 4) );
}
e fare una roba del genere


EDIT
oops menelicte mi ha battuto sul tempo :)

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 21:58
da TonT
hum...può andar bene( se non trovo di meglio)  :D
grazie ;)

ps Non metto Risolto perchè se qualcuno ha qualche altro consiglio è ben accetto  ;D

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 22:02
da max.achille
non ci ho mai provato e non so se può funzionare ma la mia idea è qualcosa del tipo
if (ha premuto invio) {
printf("\b");
}
dove \b sta a significare backspace, ovvero gli fa stampare un "cancella indietro" che dovrebbe mangiarsi l'invio dell'utente. Ok sto delirando vero???

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 22:12
da menelicte
max.achille ha scritto: non ci ho mai provato e non so se può funzionare ma la mia idea è qualcosa del tipo
if (ha premuto invio) {
printf("\b");
}
dove \b sta a significare backspace, ovvero gli fa stampare un "cancella indietro" che dovrebbe mangiarsi l'invio dell'utente. Ok sto delirando vero???
non funziona
credo che l'inizio dello stream di output coincida con l'inizio della riga
(non funzionano neanche le funzioni per la gestione del cursore nei file)

Re: C funzione per riposizionare cursore

Inviato: sabato 16 giugno 2007, 22:35
da bite
Ci sono le sequenze di escape.

Codice: Seleziona tutto

printf ("\e[2J"); /* pulisce lo schermo */
printf ("\e1;2f"); /* manda il cursore a riga 1 colonna 2 */
etc etc (prova a cercare "escape sequence" con google)

Oppure librerie come ncurses.

Ciao

Re: C funzione per riposizionare cursore

Inviato: domenica 17 giugno 2007, 16:39
da TonT
ok...ho trovato questo

- Salva la posizione del cursore:
  \033[s
- Ripristina la posizione del cursore:
  \033[u

Codice: Seleziona tutto

int Menu() {
   
   char scelta;
   int s;
   printf("\t\t\t**    Menu   **\n\n");
   printf("\t\t\t1) .......\n");
   printf("\t\t\t2) ....... \n");
   printf("\t\t\t3) ....... \n");
   printf("\t\t\t4) ....... \n");
   printf("\t\t\t5) ....... \n\n");
   printf("\t\t\t   Scelta: ");
   do {
      printf("\033[9;36H");
      scanf("%c",&scelta);
      s = scelta - 48;
      printf("     ");
   } while ( (s < 1) || (s > 5) );
   return s;
}

int main() {
   int r;
   system("clear");
   r = Menu();
   printf("Uscita %d\n",r);
}
l' unica noia è che se digito 7 ( o qualunque altra cosa al di fuori dell intervallo) il cursore si riposiziona ma il 7 rimane.. però funziona alla grande..

edit anche con printf("\033[9;36H"); funziona..però rimane sempre quel problema

ri edit  ;D risolto mettendo un printf("    ");

Re: C funzione per riposizionare cursore

Inviato: domenica 17 giugno 2007, 21:05
da Berghem
prova a memorizzare il cursore avanti di 1, poi lo ripristini e lanci un /b, a quel punto ti dovrebbe cancellare il 7.....