View Full Version : [C] scrivere nella stessa posizione?
alberto.frz
05-03-2007, 14:59
ciao, ho un piccolo problema con il C.
nel mio prog, ad un certo punto dovrei aspettarmi un numero intero compreso tra 1 e 6. Nel caso in cui il numero inserito non sia valido, il prog mi ripropone la possibilità di inserire un altro numero andando a capo col cursore...e fin qui tutto ok...
vorrei invece che se il numero inserito fosse non corretto il cursore rimanesse nella stessa posizione, dandomi la possibilità di riscrivere sopra alla immisione precedente...
:stordita: scusate per la spiegazione poco lucida...
ciao
IspiCiosa
05-03-2007, 15:00
devi fare cosi:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> /* Per i socket PF_UNIX */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "common.h" /* nomi delle pipe */
int main (int argc, char * argv []) {
int clientFd, serverLen;
int digit, number, i, result;
struct sockaddr_un serverUNIXAddress;
struct sockaddr* serverSockAddrPtr;
serverSockAddrPtr = (struct sockaddr*) &serverUNIXAddress;
serverLen = sizeof (serverUNIXAddress);
/* Crea un socket UNIX, bidirezionale, protocollo di default */
clientFd = socket (PF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL);
serverUNIXAddress.sun_family = PF_UNIX; /* Dominio del server */
strcpy (serverUNIXAddress.sun_path, SOCK_NAME); /* Nome del server */
do { /* Stabilisce la connessione con il server */
result = connect (clientFd, serverSockAddrPtr, serverLen);
if (result == -1) sleep (1); /* Se fallisce, riprova dopo breve attesa */
} while (result == -1);
/* invia la sequenza da convertire */
for (i=1; i<argc; i++) {
digit=atoi(argv[i]);
write(clientFd, &digit, sizeof(int));
}
/* ... e chiude con il numero di fine sequenza */
digit=EOS;
write(clientFd, &digit, sizeof(int));
/* Infine attende il risultato */
read(clientFd, &number, sizeof(int));
printf("Il risultato e` : %d\n", number);
return 0;
}
ciao, ho un piccolo problema con il C.
nel mio prog, ad un certo punto dovrei aspettarmi un numero intero compreso tra 1 e 6. Nel caso in cui il numero inserito non sia valido, il prog mi ripropone la possibilità di inserire un altro numero andando a capo col cursore...e fin qui tutto ok...
vorrei invece che se il numero inserito fosse non corretto il cursore rimanesse nella stessa posizione, dandomi la possibilità di riscrivere sopra alla immisione precedente...Se hai premuto un invio (e lo devi fare certamente, altrimenti come confermi l'input?) il cursore è già andato sulla riga successiva. Quindi si dovrebbero usare delle funzioni specifiche e non standard per leggere la posizione del cursore e spostarlo più sopra dove vuoi.
devi fare cosi:Ehh??? Che è tutta 'sta roba!?
alberto.frz
05-03-2007, 19:37
ho capito, giustamente, io le leggo l'input con scanf che va da sola a capo dopo aver premuto invio...proverò a cercare nella rete:mc: graize.
Ehh??? Che è tutta 'sta roba!? andbin, mi meraviglio di te :O
non si vede? quello è palesemente un programma che, ehm, dunque... crea un socket TCP verso non si sa quale indirizzo presumibilmente hardcoded (pessimo), effettua stupidamente infiniti tentativi di connessione bloccandosi per un secondo tra l'uno e l'altro nell'illusa speranza che in un secondo l'host torni up o che l'amministratore abbia aperto quel target sul firewall, invia all'host remoto dei numeri potenzialmente errati (la atoi non distingue tra "0" ed input non valido e non gestisce l'overflow) credendo peraltro di inviargli singole cifre, gli manda un simbolo conclusivo a gestione speciale che introduce una potenziale vulnerabilità*, riceve un intero dall'host remoto, ed infine lo stampa su schermo. a proposito, se nel mentre cade la connessione il programma stampa un numero senza senso.
non lo trovi pertinente? :D
* il simbolo speciale potrebbe essere introdotto dalla linea di comando
andbin, mi meraviglio di te :O
non si vede?Sì ... ma ... non capisco cosa possa c'entrare (l'uso dei socket) con la richiesta iniziale di alberto.frz, cioè il poter riposizionare il cursore nel punto dove si era fatto l'input. ;)
Sì ... ma ... non capisco cosa possa c'entrare (l'uso dei socket) con la richiesta iniziale di alberto.frz, cioè il poter riposizionare il cursore nel punto dove si era fatto l'input. ;)
forse ti sta prendendo per il culo? :D :sofico:
trallallero
07-03-2007, 10:08
devi fare cosi:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> /* Per i socket PF_UNIX */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "common.h" /* nomi delle pipe */
int main (int argc, char * argv []) {
int clientFd, serverLen;
int digit, number, i, result;
struct sockaddr_un serverUNIXAddress;
struct sockaddr* serverSockAddrPtr;
serverSockAddrPtr = (struct sockaddr*) &serverUNIXAddress;
serverLen = sizeof (serverUNIXAddress);
/* Crea un socket UNIX, bidirezionale, protocollo di default */
clientFd = socket (PF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL);
serverUNIXAddress.sun_family = PF_UNIX; /* Dominio del server */
strcpy (serverUNIXAddress.sun_path, SOCK_NAME); /* Nome del server */
do { /* Stabilisce la connessione con il server */
result = connect (clientFd, serverSockAddrPtr, serverLen);
if (result == -1) sleep (1); /* Se fallisce, riprova dopo breve attesa */
} while (result == -1);
/* invia la sequenza da convertire */
for (i=1; i<argc; i++) {
digit=atoi(argv[i]);
write(clientFd, &digit, sizeof(int));
}
/* ... e chiude con il numero di fine sequenza */
digit=EOS;
write(clientFd, &digit, sizeof(int));
/* Infine attende il risultato */
read(clientFd, &number, sizeof(int));
printf("Il risultato e` : %d\n", number);
return 0;
}
o anche cosí:
fprintf(stdout,"%c[%d;%dH",27,y,x);
dove y e x sono le coordinate dello schermo :asd:
fprintf(stdout,"%c[%d;%dH",27,y,x);Su Linux è OK, su Windows no. Sui "vecchi" Win95/98 si poteva caricare ANSI.SYS che gestiva questi escape.
Comunque bastava scrivere: printf ("\033[%d;%dH", y, x);
trallallero
07-03-2007, 10:30
Su Linux è OK, su Windows no. Sui "vecchi" Win95/98 si poteva caricare ANSI.SYS che gestiva questi escape.
cooooosa ? M$ vi ha tolto anche queste ? :mbe:
boh ? contenti voi :asd:
Su Linux è OK, su Windows no. Sui "vecchi" Win95/98 si poteva caricare ANSI.SYS che gestiva questi escape.
Comunque bastava scrivere: printf ("\033[%d;%dH", y, x); non la sapevo sta cosa delle coordinate messe tra [ ; H
ma è standard del C??
ma è standard del C??No non c'entra il C (o qualunque altro linguaggio).
Vedere <qui> (http://en.wikipedia.org/wiki/ANSI_escape_code) e <qui> (http://linux.about.com/library/cmd/blcmdl4_console_codes.htm).
repne scasb
07-03-2007, 20:52
Per il supporto ANSI in Windows NT/2k/XP, modificare il file C:\WINDOWS\SYSTEM32\CONFIG.NT aggiungendo la seguente riga alla fine del file:
device=%SystemRoot%\system32\ansi.sys
Creare quindi un link a C:\WINDOWS\SYSTEM32\COMMAND.COM.
Eseguire il link, ed ecco il supporto ANSI in XP.
Per il supporto ANSI in Windows NT/2k/XP, modificare il file C:\WINDOWS\SYSTEM32\CONFIG.NT aggiungendo la seguente riga alla fine del file:
device=%SystemRoot%\system32\ansi.sys
Creare quindi un link a C:\WINDOWS\SYSTEM32\COMMAND.COM.
Eseguire il link, ed ecco il supporto ANSI in XP."Piccolo" dettaglio: poi il supporto degli escape ANSI in effetti c'è ma solo per le applicazioni DOS (16 bit), non di certo per le applicazioni Win32. :D ;)
repne scasb
07-03-2007, 21:17
"Piccolo" dettaglio: poi il supporto degli escape ANSI in effetti c'è ma solo per le applicazioni DOS (16 bit), non di certo per le applicazioni Win32. :D ;)
Meglio di niente.:)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.