2011-08-19 19 views
6
import std.stdio; 

void main(){ 

    int n; 
    while(readf("%d", &n)){ 
    if(n == 11) 
     break; 
    writeln(n); 
    } 
} 

La primera iteración funciona e imprime n, pero después de eso readf() nunca vuelve.¿Por qué el readf no se comporta como se esperaba?

La documentación tiene una sola línea que explica readf():

uint readf (A ...) (en una charla el formato [], A args);

For­mat­ted read one line from stdin. 

Am hago algo mal? o hay algo de malo en readf()? Solo necesito leer los números de la entrada estándar.

usando: DMD 2.054 64 bits

Respuesta

9

Creo que es porque readf maneja espacios de manera diferente que scanf en C. Es necesario leer de forma explícita en los espacios, por lo que cambiar readf("%d", &n) a readf("%d ", &n) y debería funcionar (con suerte).

Aquí es una cita de Andrei, que implementa la función:

Esto es por diseño. El ejemplo funciona cuando se modifica de la siguiente manera:

import std.stdio;

void main() {
int i, j;
readf ("% s", & i);
readf ("% s", & j);
}

El espacio antes de que el segundo parámetro indica readf leer y omitir toda espacios en blanco antes de intentar la conversión.

He implementado readf para ser una cantidad mucho más nazi sobre el espacio en blanco que scanf en un intento de mejorar su precisión. Scanf ha sido célebremente difícil de usar para el análisis y validación de entradas complejas, y atribuyo algo de eso a su actitud de laissez-faire hacia el espacio en blanco . Me alegraría relajar algo de la insistencia de readf en el manejo preciso del espacio en blanco si hay suficiente evidencia de que eso sirve más a de nuestros usuarios. Personalmente, creo que el comportamiento actual (estricto por defecto, fácil de relajar) es lo mejor.

http://www.digitalmars.com/d/archives/digitalmars/D/bugs/Issue_4656_New_stdio.readf_does_not_ignore_white_space_24214.html

Cuestiones relacionadas