Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Samsung rinnova la serie pieghevole di punta con Galaxy Z Fold8 Ultra: pannello interno da 8 pollici quasi senza piega, cerniera Flex Titanium, Snapdragon 8 Elite Gen 5 for Galaxy e batteria finalmente da 5.000 mAh. Prezzo italiano da 2.299 a 2.899 euro. Tra colorimetro, benchmark reali e giorni di uso quotidiano, ecco dove questo pieghevole convince e dove il nome Ultra fatica ancora a trovare piena giustificazione
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
La nuova Insta360 X6 introduce sensori Sony da 1/1.1" e un SoC Triple AI a 4nm. Analizziamo le riprese 8K, il primo Dolby Vision nativo a 10-bit nel settore sferico e l'innovativo flusso di lavoro diretto sulla futura versione 22 di DaVinci Resolve.
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Dopo due settimane trascorse al volante della Dacia Spring 2026 possiamo raccontarvi tutto, dalle novità di motore e batteria, fino ai consumi in tutti le situazioni, compresa l'autonomia reale ad alta velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 31-01-2007, 11:52   #1
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
[C] Uso di scanf() per input diversi di volta in volta

Ho bisogno di usare scanf per poter leggere, di volta in volta, input che potrebbero essere differenti... mi spiego meglio:

La prima volta l'utente potrebbe inserire '1' e viene chiamata la funzione 1 del programma, al termine di essa si richiede di nuovo l'input. A questo punto l'utente potrebbe inserire "2 a b", quindi viene chiamata la funzione 2 ma vengono gestiti anche i parametri a e b che potrebbero essere caratteri, stringhe, ecc. Oppure potrebbe scrivere 'q' per far terminare il programma, ecc. ecc. E' possibile farlo con una sola scanf e poi elaborare ciò che è stato inserito in maniera differente a seconda dei vari casi? (ovviamente tutti i possibili casi sono già noti)
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 12:22   #2
Griffo
Member
 
L'Avatar di Griffo
 
Iscritto dal: Jan 2007
Messaggi: 70
Non ricordo bene la sintassi del c tuttavia potresti assegnare ad una varibile di tipo string il valore ricevuto da scanf e poi valutarla con un if, magari il tutto dentro un ciclo while per valutare l'uscita del ciclo (se la string è ugulae a "q")...

Ultima modifica di Griffo : 31-01-2007 alle 12:26.
Griffo è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 12:47   #3
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Però io ho bisogno di manipolare separatamente tutti i parametri che l'utente inserisce... voglio dire, se viene inserito un numero, una stringa e un carattere (si intende sempre che questa "combinazione" sia prevista dal programma e che i vari parametri siano separati da spazi o da trattini o da altro) dovrò poter gestire questi tre valori in modo separato... allo stesso tempo però deve essere possibile inserire prima un carattere, poi una stringa e poi un numero, ecc. ecc.

spero di essermi spiegato (in poche parole il programma non dispone di un menu, ma viene fatta una "selezione" al momento dell'input ed in base all'input)
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 14:02   #4
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Usa la funzione gets al posto di scanf

Codice:
char* stringa;
stringa=(char*)malloc(MAX_LUNGHEZZA);
gets(stringa);
A quel punto dividi la stringa in base agli spazi inseriti e implementi la logica che preferisci
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 14:23   #5
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da yorkeiser
Usa la funzione gets al posto di scanf

Codice:
char* stringa;
stringa=(char*)malloc(MAX_LUNGHEZZA);
gets(stringa);
A quel punto dividi la stringa in base agli spazi inseriti e implementi la logica che preferisci
Non so se parlo a proposito, ma dovunque mi giro e mi documento leggo che "gets" dovrebbe essere evitata come la peste a causa del fatto che non si può limitare l'effetto di una stringa inserita più lunga di quella consentita. Da quel pochissimo che so, leggo sempre che si dovrebbe utilizzare fgets al posto di gets.

Scusami in anticipo se ho detto stupidaggini.

Per Kaos: l'utilizzo di "case" non potrebbe risolverti il problema?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 14:36   #6
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Quote:
Non so se parlo a proposito, ma dovunque mi giro e mi documento leggo che "gets" dovrebbe essere evitata come la peste a causa del fatto che non si può limitare l'effetto di una stringa inserita più lunga di quella consentita. Da quel pochissimo che so, leggo sempre che si dovrebbe utilizzare fgets al posto di gets.

Scusami in anticipo se ho detto stupidaggini.

Non hai detto stupidaggini: se prevedi di usare stringhe lunghe hai ragione, l'uso di fgets sulla STDIN al posto di gets è vivamente consigliabile, come hai rimarcato. Nel caso di un programma che non sembra dover leggere stringhe lunghe, come quello proposto da ka0s - almeno dagli esempi di utilizzo che ne ha suggerito - puoi tranquillamente usare la gets: non corri il rischio di andare in overflow sullo stack per qualche carattere inserito
Comunque, in linea di massima, la fgets è certamente più 'sicura' della gets
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 14:58   #7
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
grazie per le risposte

però ho bisogno di spiegazioni aggiuntive... una volta acquisita la stringa con gets (o fgets) come si fa a manipolarla?

non c'è proprio un modo per fare lo stesso ma usando scanf ?

Per RaouL_BennetH: con "case" intendi il costrutto switch ?
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 15:13   #8
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16215
Quote:
Originariamente inviato da ka0s
Ho bisogno di usare scanf per poter leggere, di volta in volta, input che potrebbero essere differenti
Allora hai bisogno di fgets, non di scanf.
scanf si aspetta un input organizzato secondo un certo formato: ad esempio, una parola seguìta da due numeri.
fgets non fa questa assunzione, e prende la stringa così com'è, lasciando a te l'incarico di manipolarla in sèguito.
Quote:
E' possibile farlo con una sola scanf e poi elaborare ciò che è stato inserito in maniera differente a seconda dei vari casi? (ovviamente tutti i possibili casi sono già noti)
Potresti provare a usare strtok per manipolare la stringa; ma è una funzione che io non ho mai usato, e non ti so aiutare.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2007, 16:47   #9
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da ka0s
grazie per le risposte

però ho bisogno di spiegazioni aggiuntive... una volta acquisita la stringa con gets (o fgets) come si fa a manipolarla?

non c'è proprio un modo per fare lo stesso ma usando scanf ?

Per RaouL_BennetH: con "case" intendi il costrutto switch ?
Si scusami per il modo poco preciso di indicarlo
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 11:12   #10
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
pensavo di controllare il primo carattere della stringa inserita e poi operare di conseguenza... solo che non so bene come fare...

se io inserisco come input: "1 stringa1 stringa2"
il programma deve fare un qualcosa (il valore '1' indica ad es. una specifica funzione) con le due stringhe, che ovviamente vanno trattate separatamente... idem se invece delle stringhe ci fossero numeri.
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 12:14   #11
mapomapo
Senior Member
 
L'Avatar di mapomapo
 
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
usa una funzione di questo tipo:
Codice:
int menu()
{
	int choice;

	printf("Prego effettuare una scelta:\n");
	printf("1. Inserire un nuovo elemento\n");
	printf("2. Stampare la lista\n");
	printf("0. Esci dal programma\n"); //Tu qui specifica i vari input dell'utente
	scanf("%d", &choice);
	return choice;
}
nel main invece avrai una cosa di questo tipo:
Codice:
do
	{	
		scelta=menu();

		switch(scelta)
		{
			case 1:
			{
				printf("Categoria: ");
				scanf("%s", category);
				printf("Nome prodotto: ");
				scanf("%s", productname);
				printf("Prezzo: ");
				scanf("%f", &money);
	
				ins_centro(&testa,category,productname,money);
			}
			break;

			case 2:
			{
				stampa_lista(testa);
			}
			break;
			default:break;
		}
	}while(scelta!=0);
ovviamente il mio codice viene da un programma completamente diverso, ma spero di averti dato uno spunto

Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea!
mapomapo è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 13:11   #12
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
Se l'utente inserisce:

1 ab cd[seguiti da INVIO]

I caratteri 1[spazio]ab[spazio]cd[INVIO] rimangono nel buffer di input fino a quando non vengono rimossi...

Puoi anche leggerli con scanf diverse...ad esempio:
Codice:
scanf("%d", &scelta); /* rimuove i 1[spazio] */

if(scelta == 1) funzione1();

...

void funzione1()
{
   char param1[MAX_BUF], param2[MAX_BUF];
   scanf("%s", param1); /* rimuove ab[spazio] */
   scanf("%s", param2); /* rimuove cd[invio] */
   ....
}
Quindi per gestire l'inserimento separato da spazi non devi fare assolutamente niente...la gestione è la stessa che attueresti nel caso l'inserimento fosse separato da [invio].

Ultima modifica di cionci : 03-02-2007 alle 13:18.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 13:11   #13
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
grazie mapomapo!
il problema è che una cosa del genere sapevo già farla, mentre ora devo fare in modo che l'input sia una sola linea per volta. Quindi il programma dopo non deve chiedere altre cose.

la difficoltà sta proprio nel realizzare questo procedimento!

EDIT: cionci, abbiamo postato praticamente insieme cmq adesso provo la tua idea (non sapevo che si potesse fare una cosa del genere!!)
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2007, 13:17   #14
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
Ah...togli la & dalle ultime due scanf...errore di copia e incolla
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing" Insta360 X6: Dolby Vision, 8K e montaggio "...
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli Due settimane con Dacia Spring 2026: novit&agrav...
AORUS GeForce RTX 5080 INFINITY WOOD 16G: una scheda video diversa dalle altre AORUS GeForce RTX 5080 INFINITY WOOD 16G: una sc...
Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla Hyundai Ioniq 9: dopo due settimane di test non ...
Vogliono costruire un monumento per Elon...
Ring Intercom Audio crolla a 39,99€ su A...
La Francia blocca il divieto dei social ...
Trump citato in giudizio: chiesto lo sto...
PEC obbligatoria per revisione e passagg...
Il ripulitore di watermark Claude da 4.5...
Xiaomi 17 Ultra scambia il Sole per la L...
È arrivata la migliore e-bike Eng...
Apple Mac mini M4, ecco perché conviene ...
Robot aspirapolvere in offerta su Amazon...
Il nuovo pick-up elettrico di Ford &egra...
Google Pixel 11 arriva su Amazon: preord...
Mega sconti su attrezzi a batteria e rob...
Google Search dà per morto Sam Al...
Il noleggio delle GPU NVIDIA si quota in...
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: 06:58.


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