PDA

View Full Version : [C] liberare lo standard input


gepeppe
12-02-2008, 20:17
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:


/*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);
}


Questo è l'output:
Inserisci un numero
5
Inserisci una stringa
La stringa che hai inserito è:
Premi Invio per continuare!

Ecco, il programma termina, perchè è come se acquisici avesse anche il mio Invio e non entra nel while..ho provato fflush(stdin) ma nulla...come si potrebbe risolvere?

grazie

AlleBacco
14-02-2008, 15:37
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.

Manbearpig
14-02-2008, 18:03
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.

gepeppe
14-02-2008, 18:28
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...


if (c == '\n')
/*scarto il new line*/
c = getchar();

/*inizio l'acquisizione*/
c = getchar();
while(c != '\n')
{
......

che ne dite?

Manbearpig
14-02-2008, 18:34
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.

AnonimoVeneziano
14-02-2008, 18:37
while (getchar() != '\n');

Ciao

EDit : Da mettere tra un input e l'altro.

Manbearpig
14-02-2008, 19:14
Magari puo' esserti utile...


#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);
}

AlleBacco
14-02-2008, 21:20
getche(); non posso usarla, perchè non devo ristampare a video il valore immesso. (anche se devo dire che non la conoscevo proprio!!).


guarda che getche() non ristampa a video il valore immesso, ma ti permette di vedere quello che scrivi. con getch() quando scrivi non visualizzi nulla a video e non si sposta neanche il cursore...
prova a vedere con questo piccolo programmino come funzionano (ricorda che non devi dare l'invio quando hai immesso un carattere!)

#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);
}

cionci
15-02-2008, 01:42
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.

gepeppe
15-02-2008, 10:16
while (getchar() != '\n');

Ciao

EDit : Da mettere tra un input e l'altro.

grazie a tutti per le risposte..ho provato i vari esempi ma credo utilizzerò questo di AnonimoVeneziano

ciao