Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Dopo più di un anno dal primo test drive ci siamo rimessi al volante della Renault 5 E-Tech Electric, questa volta utilizzandola come prima auto per circa due settimane. Scoprite con noi se il progetto convince ancora
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-10-2005, 17:48   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
[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, 19: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, 19:55   #3
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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, 20:10   #4
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
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, 22: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, 22:36   #6
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
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, 06: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, 18: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, 18: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, 18: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, 19: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, 19: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, 07: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


Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
Xbox Cloud Gaming si espande e arriva su...
Il riconoscimento facciale con IA per co...
MacBook Ultra: il nuovo design arriver&a...
Gli utenti passano più tempo su Instagra...
L'AI sta facendo guadagnare miliardi anc...
L'Odissea di Nolan rilancia Assassin's C...
Russia vieta il mining di criptovalute a...
Lenovo sta preparando il lancio di un Go...
L'intelligenza artificiale colpisce dove...
Xiaomi, si prepara ad aggiornare la fasc...
Rincari in arrivo per gli iPhone: i nuov...
Le edizioni fisiche dei giochi per PlayS...
Aziende IA comprano migliaia di libri ac...
L'IA frena gli utenti di Reddit: azioni ...
Questi pannelli solari non producono sol...
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: 22:17.


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