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

void main(){ 

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

Pierwsza iteracja działa i drukuje n, ale po tym readf() nigdy nie wraca.Dlaczego readf nie działa zgodnie z oczekiwaniami?

Dokumentacja ma tylko jeden wiersz wyjaśniając readf():

uint readf (A ...) (w char [] formatu, o args);

For­mat­ted read one line from stdin. 

Am zrobić coś złego? czy coś jest nie tak z readf()? Muszę tylko odczytać liczby ze standardowego wejścia.

używając: DMD 2,054 64-bitowy

Odpowiedz

9

wierzę, że to dlatego, readf obsługuje przestrzenie inaczej niż scanf w C. Trzeba wyraźnie odczytać w przestrzeni, tak zmienić readf("%d", &n) do readf("%d ", &n) i powinno działać (mam nadzieję).

Oto cytat z Andrei, który zaimplementował funkcję:

Jest to zgodne z projektem. Przykład działa po zmodyfikowaniu w następujący sposób:

import std.stdio;

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

Spacja przed drugim parametrem mówi readf, aby przeczytać i pominąć wszystkie białe znaki przed próbą konwersji.

Zaimplementowałam readf, aby być uczciwym bardziej nazistowskim o białych spacja niż scanf, próbując poprawić jego precyzję. Scanf został słynnie bardzo trudny w użyciu do złożonego analizowania danych wejściowych i sprawdzania poprawności, i przypisuję to do jego leseferystycznej postawy w stosunku do białych znaków . Z przyjemnością rozluźniłbym pewną presję readf na precyzyjną obsługę białych znaków, jeśli istnieje wystarczający dowód, że obsługuje ona większość naszych użytkowników. Osobiście uważam, że obecne zachowanie (surowe domyślnie, łatwe do zrelaksowania się) jest najlepsze.

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

Powiązane problemy