|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[C] liberare lo standard input
Salve, scusate per l'oggetto, ma nn sapevo come scriverlo meglio. Allora ho questo probelma, ho una funzione A, al cui interno richiedo un numero tramite getchera();, e dopo aver acquisito questo valore, lo passo ad una funzione B, che mi salva tutto quello che scriverà dalla tastiera finchè non premo invio. Il problema è che non entra proprio nel ciclo while, perchè è come se avesse ancora memorizzato il valore. Ecco un esempio che chiarisce meglio:
Codice:
/*Nella funziona A, oppure nel main, è lo stesso*/
printf("Inserisci un numero\n");
c = getchar();
acquisisci(c);
/*Nella funzione acquisisci*/
void acquisisci(int Number)
{
int c, i;
char *BUFFER;
/*alloca lo spazio per contenere una stringa di MAX_C caratteri*/
BUFFER = (char *)malloc(100*sizeof(char));
printf("Inserisci una stringa\n");
i = 0;
/*Acquisisco il primo carattere*/
c = getchar();
/*il ciclo acquisisce caratteri fino al raggiungimento di MAC_C caratteri acquisiti*/
/*oppure finche' non si preme invio*/
while(c != '\n')
{
BUFFER[i] = c;
i++;
c = getchar();
}
/*chiude la stringa*/
BUFFER[i] = '\0';
printf("La stringa che hai inserito è: %s\n", BUFFER);
}
Codice:
Inserisci un numero 5 Inserisci una stringa La stringa che hai inserito è: Premi Invio per continuare! grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Dec 2006
Città: Fidenza (Parma)
Messaggi: 160
|
Ciao, non sono molto esperto di programmazione, però mi ricordo di aver letto su un libro di C che c'è un'altra funzione per l'input, oltre a getchar():
int getch(); int getche(); Entrambe le funzioni aspettano l'immissione di un tasto e ritornano immediatamente, getche(), a differenza di getch(), visualizza a schermo anche il carattere premuto. Secondo me, potresto provare a sostituire c = getchar(); con c = getche(); queste due funzioni che ho detto si trovano all'interno della libreria conio.h, ma non fanno parte dello standard ANSI, quindi è possibile che non ci siano nel compilatore che usi. Spero di essere stato utile.
__________________
Q6600; Biostar P43D2A7; 2x2Gb DDR2 800 (5-5-5-15); 500 Gb + 1000 Gb Hd Sata2; 9800GTX+ 512 Mb ; X-Fi Xtreme Music. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 90
|
Boh a me sembra che con la prima getchar prendi solo il 5, poi chiami la funzione acquisisci e li con la getchar vai a prendere il primo invio... di consegueza la funzione esce. Potresti banalmente fare una funzione generica per l'acquisizione dell'input dove fai un ciclo che termina in caso di '\n' e usarla anche per prendere il primo numero in input.
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
getche(); non posso usarla, perchè non devo ristampare a video il valore immesso. (anche se devo dire che non la conoscevo proprio!!).
cmq Manbearpig, non ho capito molto bene cosa intendi. Io avevo pensato di mettere un if(c == '\n') prima di acquisire la stringa da tastiera in modo da scartare il tasto invio... Codice:
if (c == '\n')
/*scarto il new line*/
c = getchar();
/*inizio l'acquisizione*/
c = getchar();
while(c != '\n')
{
......
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 90
|
intendo che dovresti creare una funzione a parte che usi solo ed esclusivamente per acquisire l'input e quindi usarla anche per prendere il primo numero nel tuo caso il 5.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
while (getchar() != '\n');
Ciao EDit : Da mettere tra un input e l'altro.
__________________
GPU Compiler Engineer |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 90
|
Magari puo' esserti utile...
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 50
void get_input(char* s)
{
char c = 0;
int idx = 0;
memset(s,'\0',BUFFER);
while((c = getchar()) != '\n')
{
s[idx] = c;
idx++;
}
}
int main(void)
{
char* s = (char*)malloc(BUFFER);
get_input(s);
printf("%s\n",s);
free(s);
//oppure
char st[BUFFER];
get_input(st);
printf("%s\n",st);
}
|
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Dec 2006
Città: Fidenza (Parma)
Messaggi: 160
|
Quote:
prova a vedere con questo piccolo programmino come funzionano (ricorda che non devi dare l'invio quando hai immesso un carattere!) Codice:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
char a;
printf("Scrivi una lettera\n");
a=getch();
printf("\nHai scritto: %c\n",a);
a=getche();
printf("\nHai scritto: %c\n",a);
}
__________________
Q6600; Biostar P43D2A7; 2x2Gb DDR2 800 (5-5-5-15); 500 Gb + 1000 Gb Hd Sata2; 9800GTX+ 512 Mb ; X-Fi Xtreme Music. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Bisogna sempre tenere presente che getch NON è una funzione standard (come tutte quelle in conio.h), quindi prima di consigliarla a qualcuno fatelo solamente se non ci sono alternative accettabili.
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
ciao
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:20.




















