PDA

View Full Version : [C] Piccolissimo problema scanf e printf


-Ivan-
06-10-2005, 17:48
#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.

ianaz
06-10-2005, 19:28
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... :mbe:

-Ivan-
06-10-2005, 19:55
infatti mi sembra tutto corretto... :mbe:

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 :confused: assurdo che mi devo bloccare per una cosa del genere.

Ziosilvio
06-10-2005, 20:10
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ì:
while (getchar() != '\n')
;

VegetaSSJ5
06-10-2005, 22:25
Ziosilvio perchè la prima scanf prende solo i caratteri senza il newline (che poi viene preso dalla seconda scanf)??

Ziosilvio
06-10-2005, 22:36
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.

cionci
07-10-2005, 06:46
In pratica la scanf, a meno di particolari parametri (%s con il limitatore a \n), non rimuove lo \n finale dallo stream...

Andrea16v
25-11-2008, 18:23
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...

cionci
25-11-2008, 18:27
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/clibrary/cstdio/fgets.html
Come terzo parametro inserisci stdin (in questo modo ti legge dallo stdinput.

Andrea16v
25-11-2008, 18:49
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..


Per la lettura ti consiglio fgets: http://www.cplusplus.com/reference/clibrary/cstdio/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()?

cionci
25-11-2008, 19:01
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.

Andrea16v
25-11-2008, 19:38
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/000095399/functions/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?

cionci
26-11-2008, 07:31
Quella read non è nello standard del C ;)
In ogni caso è simile alla fread, quindi il discorso non cambia.