Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Abbiamo provato Google Pixel 11, il più accessibile della nuova gamma: chip Tensor G6 condiviso con i modelli Pro, fotocamera 48 MP con Magic Capture e Stili Fotografici, display Actua da 3000 nit e batteria da 4985 mAh. Ecco come si comporta nell'uso quotidiano, e cosa cambia davvero rispetto a Pixel 11 Pro e Pro XL
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship
Google Pixel 11 Pro XL debutta in Italia con il nuovo Tensor G6, lo Zoom Pro fino a 120x, il display Super Actua da 3600 nit e la new entry HiLight riservata ai modelli Pro: lo abbiamo provato in anteprima per diversi giorni prima del lancio commerciale, tra fotocamera generativa, ricarica ancora indietro rispetto ai rivali e un prezzo che parte da 1399 euro
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


Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Anthropic e Salesforce annunciano l'inte...
Ricoh GR IVx: annunciata la compatta da ...
I consumatori non sarebbero interessati ...
Cybersecurity: come si sono mossi gli AP...
I giochi digitali non sono di proprietà ...
Photoshop ha una seconda interfaccia: se...
Samsung Galaxy S27 si mostra nei primi r...
Celle solari tandem perovskite-silicio a...
Pneumatici Continental con il 43% di mat...
Meta: la Polonia chiede alla Commissione...
LEGO Skylines arriva da Paradox e Icefla...
1100 Hz su un monitor: Samsung supera un...
Plaud One è il nuovo wearable AI ...
ESA vuole espandere le capacità d...
Le auto di Xiaomi arrivano da noi nel 20...
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: 02:12.


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