Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
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 essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-11-2008, 23: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 07-11-2008, 00: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 07-11-2008, 00: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, 10: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, 12: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 12:15.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2008, 12: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, 14: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, 14: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, 15: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 15:46.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


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...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Apple annuncia i nuovi MacBook Pro con s...
Warhorse Studios colpita da un grave att...
MX Master 4, arriva l'edizione speciale ...
Kali Linux 2026.3 porta la caccia alle r...
Oracle si affida a OpenAI: ChatGPT e Cod...
Kaspersky punta su IA e servizi gestiti ...
Già sfruttata la falla Brotli che...
Potrebbe essere stato scoperto un nuovo ...
Claude Code, il prompt per scovare telec...
Palit e GALAX smentiscono le voci sulla ...
Fujifilm annuncia la Instax Mini Evo 2, ...
Tailscale chiude le falle SSH verso root...
Il tuo Galaxy laggava nei giochi? Samsun...
Arrivano i nuovi Amazon Echo: prezzi da ...
Il nuovo pickup elettrico Ford può alime...
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: 03:10.


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