Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-02-2008, 20:17   #1
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
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);
}
Questo è l'output:
Codice:
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
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 15:37   #2
AlleBacco
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.
AlleBacco è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 18:03   #3
Manbearpig
Member
 
L'Avatar di Manbearpig
 
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.
Manbearpig è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 18:28   #4
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
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')
	{
......
che ne dite?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 18:34   #5
Manbearpig
Member
 
L'Avatar di Manbearpig
 
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.
Manbearpig è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 18:37   #6
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 19:14   #7
Manbearpig
Member
 
L'Avatar di Manbearpig
 
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);
}
Manbearpig è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 21:20   #8
AlleBacco
Member
 
Iscritto dal: Dec 2006
Città: Fidenza (Parma)
Messaggi: 160
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
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!)
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.
AlleBacco è offline   Rispondi citando il messaggio o parte di esso
Old 15-02-2008, 01:42   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 15-02-2008, 10:16   #10
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da AnonimoVeneziano Guarda i messaggi
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
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Il regista Rian Johnson lancia a 12,99 d...
Microsoft stravolge l'app Sicurezza di W...
Mercato smartphone in caduta libera: -20...
Android 17 QPR3 Beta 3 riporta il blocco...
Le 10 offerte TOP in Amazon del weekend:...
Dyson, doppio crollo su Amazon: purifica...
Il 70% delle imprese non vede effetti de...
HillMiles MileCity1 a 616€: la city e-bi...
GAC Aion UT, prima prova: tanta roba a 2...
vivo X300 Pro a 979€: il top di gamma co...
AGIBOT fa ballare 110 Expedition A3 per ...
iPad A16 da 11'' scende a 459€ in tutti ...
Mac mini M6 crolla a 899€ (-180€ rispett...
Galaxy S27, la ricarica resta a 25W: lo ...
Claude Code, backdoor SSH: secondo Curso...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:08.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v