PDA

Visualizza versione completa : [C] Catturare frase


Nanri
06-09-2005, 19.20.31
Ho bisogno del codice necessario a catturare da input una intera frase e far puntare al primo elemento da un puntatore.. una sorta di scanf che si fermi a '\n' e non a '\0'

Downloader
06-09-2005, 19.21.42
Cio del tipo:

"Ciao a tutti!"

ed il puntatore punta su C ??

SkAkKo
06-09-2005, 19.46.47
char string[30];
char *p;
p=fgets(string,sizeof(string),stdin);
prova cosi..

Nanri
07-09-2005, 00.20.36
ho provato gia.. funziona ma non risolve il mio problema originario che ora vi spiego:

ho realizzato il gioco de la battaglia navale, l'input che posso dare, di volta in ovviamente solo la coordinata nella forma c8 ove il numero va da 0 a 9 mentre l'intero da 1 a j. Il problema che se scrivo "c5 bello"
mi segna correttamente l'attacco in c6 ma alla successiva iterazione "riceve" come input "bello". Ovviamente questo mi da errore..
avrei individuato due soluzioni:
una quella di catturare la stringa intera nella maniera in cui ha detto skakko.. non capisco perch il risultato lo stesso nonostante riesca a segnalare l'errore.

l'altra soluzione permettere all'utente di digitare solo due caratteri, dopo di che blocca l'input, ma non mi sembra fattibile almeno con le mie attuali e limitate conoscenze C.

suggerimenti?

SkAkKo
07-09-2005, 00.31.42
Originariamente inviato da Nanri
mi segna correttamente l'attacco in c6 ma alla successiva iterazione "riceve" come input "bello". Ovviamente questo mi da errore..



hai provato a mettere fflush(stdin) ??


l'altra soluzione permettere all'utente di digitare solo due caratteri, dopo di che blocca l'input, ma non mi sembra fattibile almeno con le mie attuali e limitate conoscenze C.

suggerimenti?

senno puoi provare con questo codice che avevano postato qui in programmazione (non mi ricordo chi)


char sc;
int i,app;
int ctr=1;
char Read[] = {'1','2','3'};
printf("\n\n");
printf("\t\t\t\t***********************");
printf("\n\t\t\t\t* 1) *");
printf("\n\t\t\t\t* 2) *");
printf("\n\t\t\t\t* 3) *");
printf("\n\t\t\t\t* *");
printf("\n\t\t\t\t* Scelta: *");
printf("\n\t\t\t\t***********************");
while(ctr)
{
sc=getch();
app=sc-'0';
switch (app)
{
default:
for (i=0;i<strlen(Read);i++)
{
if (sc==Read[i])
{
printf("%d",app);
ctr=0;
}
}
break;
}
}
return app;
}


praticamente legge solo i caratteri che sono specificati in Read[]
per devi modificarlo...

Dr_House
07-09-2005, 16.25.13
In risposta a Nanri Posso dire che per ovviare a quel problema basta semplicemente svuotare il buffer della tastiera.

Solamente che io conosco la versione di Win ovvero

flush();

Non sonosco la risposta per Linux se qualcuno la sa risolveremmo il problema.

Poi pu capitare che ci sia un errore del genere, con la printf non funziona il tasto BackSpace.

Non penso sia un problema della scanf ma bensi del terminale.

Questo un codice che da l'errore:


int main(){
char cordinate[10];
printf("\nInserire le coordinate: ");
scanf("%s",cordinate);
printf("\nHai inserito le seguenti coordinate: %s",cordinate);
printf("\nInserire le coordinate: ");
scanf("%s",cordinate);
printf("\nHai inserito le seguenti coordinate: %s",cordinate);
}


se inserisco ad esempio C1 C2, la seconda scanf riceve in automatico C2.


int main(){
char cordinate[10];
printf("\nInserire le coordinate: ");
scanf("%s",cordinate);
flush();
printf("\nHai inserito le seguenti coordinate: %s",cordinate);
printf("\nInserire le coordinate: ");
scanf("%s",cordinate);
printf("\nHai inserito le seguenti coordinate: %s",cordinate);
}


questo dovrebbe fungere

ma ripeto ho l'idea ma per l'inux non sto trovando nulla neanche con google

LoryOne
07-09-2005, 18.39.46
Io proporrei quest' altro codice (prendendo spunto da un post un po antico; quando il Web si faceva leggere ogni tanto :D ) e leggermente modificato.


char *UserInput(int max){
char c,*Buff;
short int i=0,j=0,vmin,vmax;

Buff=(char*)malloc(max+1);
while(c!=13 || i<2){ // Mai invio a vuoto.
// Sempre almeno una lettera ed un numero
switch(j){
case 0:vmin='A';vmax='J';break; // Lettere vailde A..J
case 1:vmin='0';vmax='9'; // Cifre valide 0..9
}
c=toupper(getch());
if(c==0||c==-32) getch(); // Elimina lo scan code, ossia
// carico il succ. carattere dal buffer
switch(c){
case 8: // Backspace
if(i>0){
i--; if(i==0) j=0;
printf("\b%c\b",255);
}break;
default:
if((c>=vmin && c<=vmax) && i<max){
printf("%c",c);
Buff[i]=c;
i++; j=1;
}
}
}Buff[i]='\0'; // Aggiungo il terminatore di stringa
return Buff;
}


max indica la lunghezza dell'input
vmin e vmax i codici Ascii delle lettere o dei numeri consentiti
i una varibile che indica il numero di input digitati correttamente
j decide se i prox. caratteri debbano essere una lettera o un numero.

Dr_House
08-09-2005, 16.12.21
se non erro il comando in Linux per l'inserimento di un char getchar() ho provato quello ma non fungeva, ho dovuto fare una ricerca su google dove diceva appunto che getch() per Win

LoryOne
08-09-2005, 16.33.09
Si, il codice per Win. (Non ho Linux)
Funziona con la modifica apportata di getch() in getchar()?

Qualora l'interpretazione corretta del backspace \b dipendesse dalla distro in uso di Linux (e mi pare di aver capito che bisogna agire manualmente su un DB che associa il codice di un tasto ad una sequenza di operazioni personalizzabili a piacere), credo che sia necessario richiamare la corretta funzione per spostare il cursore in una data locazione della console ed aggiugere un po di codice per emulare l'interpretazione...

LoryOne
08-09-2005, 16.39.20
A questo punto avrei dovuto:
1 - cambiare getch() in getchar()
2 - cambiare gotoxy() con move()
In pratica questo piccolo programmino non avrebbe funzionato su Linux a patto di modificare il sorgente includendo gli header corretti ?

LoryOne
08-09-2005, 16.50.39
Un altro appunto lo si potrebbe fare a questa riga di codice:


switch(c){
case 8: // Backspace


Chi l'ha detto che al backspace sia associato valore 8 ?
Mi pare di aver letto che backspace pu assumere il valore 8 o 127.
A questo punto come fare per far funzionare correttamente il programma su tutte le distro Linux ?