Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il cuore digitale di F1 a Biggin Hill: l’infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l’infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-10-2005, 18:48   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
[C] Piccolissimo problema scanf e printf

Quote:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char p1, p2;

//Inserimento dei nomi giocatori
printf("Inserisci il nome del player 1: ");
scanf("%c", &p1);
printf("\n");
printf("Inserisci il nome del player 2: ");
scanf("%c", &p2);
printf("\n");
}
A parte che per ora leggo solo un carattere ma mi va bene così, mi sapete dire per quale motivo il programma non mi legge il carattere del player 2?
Se io aggiungo ad esempio alla fine un printf che stampa il carattere vedo che non ha letto niente ed il programma termina, quale può essere il problema di avere due scanf di seguito?
Mi sembra molto strano.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2005, 20:28   #2
ianaz
Senior Member
 
L'Avatar di ianaz
 
Iscritto dal: Jan 2005
Città: London, United Kingdom
Messaggi: 959
Quote:
Originariamente inviato da -Ivan-
A parte che per ora leggo solo un carattere ma mi va bene così, mi sapete dire per quale motivo il programma non mi legge il carattere del player 2?
Se io aggiungo ad esempio alla fine un printf che stampa il carattere vedo che non ha letto niente ed il programma termina, quale può essere il problema di avere due scanf di seguito?
Mi sembra molto strano.
infatti mi sembra tutto corretto...
__________________
zattix
ianaz è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2005, 20:55   #3
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Quote:
Originariamente inviato da ianaz
infatti mi sembra tutto corretto...
Eh anche a me, è assurdo, alla fine del quote del codice comunque mi sono dimenticato di mettere il system (PAUSE) e il return 0 ma nel programma c'è.
Ho provato anche a fare un programma a parte perchè questo codice è all'interno di un programma e mi da lo stesso problema, assurdo.
Uso il dev c++.
Booooooooooooooooo assurdo che mi devo bloccare per una cosa del genere.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2005, 21:10   #4
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da -Ivan-
per quale motivo il programma non mi legge il carattere del player 2?
Perché quando tu scrivi il carattere e premi Invio, sullo standard input finiscono un carattere e il newline.
La prima scanf prende il carattere.
La seconda prende il newline.

Prova a pulire lo standard input dopo il primo inserimento, così:
Codice:
while (getchar() != '\n')
    ;
__________________
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 06-10-2005, 23:25   #5
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Ziosilvio perchè la prima scanf prende solo i caratteri senza il newline (che poi viene preso dalla seconda scanf)??
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 06-10-2005, 23:36   #6
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quando passi gli argomenti "%c" e &p1 a scanf, le stai dicendo che deve leggere dallo standard input una sequenza costituita da un unico carattere, e poi scrivere quel carattere nella regione della memoria corrispondente a p1.
Ora, l'input-output standard del C è bufferizzato: pertanto i caratteri che immetti con la tastiera non vengono depositati sullo standard input fino alla pressione del tasto Invio, che però ha anche l'effetto di accodare un newline.
Il risultato è che (supponendo che l'utente scriva un carattere e poi prema Invio) quando la prima scanf viene chiamata, sullo standard output c'è una sequenza del tipo '\0xy''\n': dopo l'esecuzione della prima scanf, '\0xy' è stato rimosso dallo standard input, ma '\n' c'è ancora.
Perciò lo standard input non è vuoto quando la seconda scanf viene chiamata, e quella parte subito senza aspettare che l'utente scriva nulla.
__________________
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 07-10-2005, 07:46   #7
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
In pratica la scanf, a meno di particolari parametri (%s con il limitatore a \n), non rimuove lo \n finale dallo stream...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2008, 19:23   #8
Andrea16v
Senior Member
 
L'Avatar di Andrea16v
 
Iscritto dal: Mar 2003
Messaggi: 3852
Approfitto di questa vecchia discussione per chiedere un paio di cose inerenti al tema:
c'e' una funzione per svuotare lo standard input del tutto prima di una nuvoa scanf o va fatta a mano in qualche modo (come)?
Seconda cosa: utilizzando lo stesso target (un array di caratteri) è possibile leggere anche piu' parole separate dallo spazio invece che solo la prima? Ovviamente non potendo prevedere in anticipo quante sono le parole...
__________________
Cerco fotocamera con buono zoom!! CLICCA!
° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) °
Andrea16v è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2008, 19:27   #9
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 la prima, non ci sono funzioni standard, su alcuni sistemi flush() funziona, ma lo standard impone di usarlo solo sugli stream di output.
In alternativa il codice è stato postato poco sopra:

while (getchar() != '\n')
;

Per la lettura ti consiglio fgets: http://www.cplusplus.com/reference/c...dio/fgets.html
Come terzo parametro inserisci stdin (in questo modo ti legge dallo stdinput.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2008, 19:49   #10
Andrea16v
Senior Member
 
L'Avatar di Andrea16v
 
Iscritto dal: Mar 2003
Messaggi: 3852
Quote:
Originariamente inviato da cionci Guarda i messaggi
Per la prima, non ci sono funzioni standard, su alcuni sistemi flush() funziona, ma lo standard impone di usarlo solo sugli stream di output.
In alternativa il codice è stato postato poco sopra:

while (getchar() != '\n')
;
Solitamente lo uso anch'io questo metodo, pero' non e' detto che nel buffer ci siano solo newline, da qui la mia domanda..

Quote:
Per la lettura ti consiglio fgets: http://www.cplusplus.com/reference/c...dio/fgets.html
Come terzo parametro inserisci stdin (in questo modo ti legge dallo stdinput.
In generale si puo' dire che la fgtets per questo scopo sia meglio della apparentemente simile read()?
__________________
Cerco fotocamera con buono zoom!! CLICCA!
° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) °
Andrea16v è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2008, 20:01   #11
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 Andrea16v Guarda i messaggi
Solitamente lo uso anch'io questo metodo, pero' non e' detto che nel buffer ci siano solo newline, da qui la mia domanda..
Appunto, fino a quando ci sono caratteri nel buffer diversi da \n continua a leggere. Quando trova \n esce.

Ti riferisci alla fread ? Sinceramente non mi sembra per niente simile fgets lavora esplicitamente sui caratteri fino a quando si verifica una di queste condizioni: raggiungo il numero massimo di caratteri o arriva uno \n.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2008, 20:38   #12
Andrea16v
Senior Member
 
L'Avatar di Andrea16v
 
Iscritto dal: Mar 2003
Messaggi: 3852
Quote:
Originariamente inviato da cionci Guarda i messaggi
Ti riferisci alla fread ? Sinceramente non mi sembra per niente simile fgets lavora esplicitamente sui caratteri fino a quando si verifica una di queste condizioni: raggiungo il numero massimo di caratteri o arriva uno \n.
Mi riferivo a questa read() che lavora sui bytes
http://www.opengroup.org/onlinepubs/...ions/read.html
da usare sullo stdin, ma ora leggendo la specifica mi pare di capire che non è consigliabile per leggere una serie di parole da stdin... ho provato ad usarla ma mi crea alcuni comportamenti strambi (penso non vada molto d'accordo con le printf che uso per stampare all'utente il da farsi prima di analizzare il suo input). Potrebbe essere?
__________________
Cerco fotocamera con buono zoom!! CLICCA!
° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) °
Andrea16v è offline   Rispondi citando il messaggio o parte di esso
Old 26-11-2008, 08:31   #13
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
Quella read non è nello standard del C
In ogni caso è simile alla fread, quindi il discorso non cambia.
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Il cuore digitale di F1 a Biggin Hill: l’infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l’infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
Le carte collezionabili dell'INPS conqui...
Football Manager 26 debutta su Steam con...
A 189,99€ con coupon: il NAS UGREEN che ...
Arm cresce ancora: ricavi oltre 1 miliar...
Xiaomi Redmi Note 14 5G ora a soli 179€:...
Spotify dovrà affrontare una nuov...
17,69€: praticamente regalato il caricat...
ECOVACS DEEBOT T80 OMNI, 600€ di sconto ...
EA fa chiarezza su controllo creativo e ...
Google Maps punta sull'AI: tante novit&a...
Qualcomm guarda oltre gli smartphone: ri...
539€, 629€ o 679€: 3 portatili HP o Acer...
Anche OnePlus attinge ai nomi scelti da ...
Apple non si arrende: altre due generazi...
Sky Mobile diventerà un vero e pr...
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: 10:20.


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