Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini è uno smartwatch compatto capace di offrire un'esperienza completa di monitoraggio della salute e fitness con una cassa da 43 mm che può adattarsi a qualsiasi tipo di polso, dal più grande al - soprattutto - più piccolo. Con l'architettura dual-chip e un'autonomia che può coprire due giorni con tranquillità, rappresenta la soluzione ideale per chi cerca prestazioni premium in un formato ridotto.
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Dopo il recente lancio della serie Xiaomi 15T di Monaco, vi parliamo oggi della versione più performante della nuova famiglia, ovvero Xiaomi 15 T Pro. Vi raccontiamo la nostra prova nel dettaglio, spiegando perché a questo prezzo e in questa fascia, questo smartphone ha davvero senso tenerlo in seria considerazione.
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer ha ampliato la sua offerta professionale con il TravelMate P6 14 AI, un notebook ultraleggero e robusto pensato per chi lavora in mobilità. Certificato Copilot+ PC, combina design premium, autonomia elevata e piattaforma Intel Core Ultra Serie 2 con funzionalità AI, garantendo sicurezza, affidabilità e produttività per l'utenza business moderna.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-11-2008, 22:53   #1
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
[C] Funzione con valore sentinella non rilevato

Salve a tutti, mi potreste dire cosa c'è di errato in questa funzione?
Codice:
void digitaVettore (char v[])
{
   int i=0;

   printf ("Digita una serie di caratteri (numeri, lettere e simboli); "
           "inserisci il carattere '!' per terminare.\n");

   do {
      scanf ("%s", &v[i]);
      i++;
   } while (v[i] != '!'); 

   i=0;

   printf ("Ecco la stringa inserita:\n");

   while (v[i] != '!') {
      printf ("%s", v[i]);
      i++;
   }
}
Il programma completo funziona correttamente, ma in entrambi i casi in cui ho utilizzato il valore sentinella (sia col "while" che col "do/while" questo non viene rilevato). Grazie in anticipo.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 23:38   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Perche' quando arrivi a valutare
Codice:
} while (v[i] != '!');
La i e' gia' incrementata, e quindi non c'e' piu' il ! appena inserito, ma cio' che c'era originariamente nel buffer in questa nuova posizione, che verra' presto sostituito dal prossimo valore inserito.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 23:53   #3
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Vero, mi era sfuggito. Ti ringrazio!
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 09:08   #4
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
Per leggere caratteri si usa %c, non %s.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 11:06   #5
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Quote:
Originariamente inviato da cionci Guarda i messaggi
Per leggere caratteri si usa %c, non %s.
Ti ringrazio, funziona. Ma sinceramente non mi è molto chiara la differenza tra i due.
Perchè devo utilizzare %c e non %s. Quando avrei potuto utilizzare %s?

EDIT Nel caso del programma in questione vorrei far notare che devo inserire lettere, numeri e simboli.

Ultima modifica di Composition86 : 07-11-2008 alle 11:15.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 11:40   #6
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
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Ti ringrazio, funziona. Ma sinceramente non mi è molto chiara la differenza tra i due.
Perchè devo utilizzare %c e non %s. Quando avrei potuto utilizzare %s?

EDIT Nel caso del programma in questione vorrei far notare che devo inserire lettere, numeri e simboli.
Quello che vuoi fare è leggere carattere per carattere (lettere, numeri e simboli), giusto ?
Un carattere con scanf si legge con %c e non con %s, con %s si legge una stringa fino all'invio.
Sinceramente non capisco perché funzionasse prima. Dovrebbe andare in ciclo infinito fino a fare un buffer overflow.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 13:15   #7
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Credo di aver capito la differenza, mi ero perso un paio di cose, faccio un elenco, potrà servire a qualcuno che fa una ricerca nel forum:

-la funzione gets(vettore) legge una stringa fino al primo invio.
-scanf(%s, vettore) legge fino al primo invio, spazio o tabulazione.
-lettura carattere per carattere, metodo decisamente scomodo.

Riguardo al tuo "dubbio", non so neanche io perchè prima funzionasse, forse avevo lasciato qualche %c o %s non voluto.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 13:47   #8
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
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
-lettura carattere per carattere, metodo decisamente scomodo.
Anche perché lo stdin del C è bufferizzato, quindi il controllo torna al programma solo alla pressione del tasto invio.
Per avere un stdin non bufferizzato - leggi: premo un carattere, il programma legge il carattere e su questo carattere posso eseguire subito delle operazioni prima della lettura successiva - si può avere solo con librerie non standard o comunque dipendenti dal sistema operativo.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 14:40   #9
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Ti ringrazio ancora, ho capito.

Però mi è venuto un altro dubbio a proposito di %c e %s, devo leggere una variabile di tipo char (quindi nelle dichiarazioni ho "char carattere"); uso questa operazione:

scanf ("%c", &carattere);

In lettura devo mettere %s al posto di %c per farlo funzionare (e non me lo spiego), mentre se voglio stampare il carattere devo mettere %c e non %s, altrimenti il programma si blocca.

Ultima modifica di Composition86 : 07-11-2008 alle 14:46.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla OPPO Watch X2 Mini, lo smartwatch compatto a cui...
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione Xiaomi 15T Pro, è lui il nuovo best buy? ...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Xiaomi SU7 si sposta da sola? Non esatta...
Cheater bannati entro 30 minuti senza ne...
Record di auto elettriche a settembre an...
In Norvegia due nuovi record: auto elett...
Linux sempre più orfano di Intel:...
Tesla conferma il bonus su Model 3: con ...
Anche Huawei prepara il suo smartphone u...
Sondaggio Steam: AMD guadagna ancora ter...
Zeekr si espande in Europa: 001, X e 7X ...
Fino a 17 sterline a telefono: il risarc...
Nintendo Switch 2 sfrutta una variante p...
AMD e OpenAI stringono un accordo strate...
Nest Cam 2K 3a gen: la videocamera da in...
Samsung 9100 PRO da 8 TB: capacità...
Il Prime Day è già partito per i seguent...
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:35.


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