Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
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: 16211
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 Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
NASA e ISRO hanno lanciato il satellite ...
Switch 2 ha venduto 5,82 milioni di cons...
Assassin's Creed Black Flag Remake: le m...
Cosa ci fa una Xiaomi SU7 Ultra alle por...
Promo AliExpress Choice Day: prezzi stra...
Nostalgico, ma moderno: il nuovo THEC64 ...
AVM avvia la distribuzione di FRITZ! OS ...
Super offerte Bose: le QuietComfort a me...
Epic vince (ancora) contro Google: Andro...
Sconti nuovi di zecca su Amazon: 27 arti...
Un'esplorazione del 'lato oscuro' di Fac...
Apple ha venduto 3 miliardi di iPhone da...
Grandi sconti oggi sugli spazzolini elet...
Reddit sfida Google: vuole diventare il ...
Nuovi sconti super mini PC: Ryzen 7, 32G...
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: 19:56.


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