Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
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


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...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Il Galaxy S26 Edge potrebbe essere ancor...
Google riaccenderà una centrale n...
Crollo per Pornhub nel Regno Unito:-77% ...
La Germania accende il suo cannone laser...
Il meglio di Amazon in 2 minuti: tira ar...
ECOVACS risponde a Eureka e dimezza il p...
Durissimo colpo per Nintendo: l'ufficio ...
Scope elettriche al minimo storico su Am...
Blue Jay e Project Eluna: robotica e AI ...
Scede a 949€ il Samsung Galaxy S25 Ultra...
Blue Yeti Nano in super offerta su Amazo...
Netflix sta preparando un'offerta per Wa...
Prezzo impossibile, è sceso ancor...
Torna il migliore dei mini PC economici:...
USA, via libera all'uso di plutonio mili...
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: 17:55.


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