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

void main(){ 

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

第一次迭代工作,它打印n,但之後readf()永遠不會返回。爲什麼readf的行爲不如預期?

該文檔僅具有單個線說明readf()

UINT readf(A ...)(以炭[]格式,A參數);

For­mat­ted read one line from stdin. 

上午我做錯了什麼?或者readf()有什麼問題嗎?我只需要從標準輸入中讀取數字。

使用:DMD 2.054的64位

回答

9

我相信這是因爲readf處理空間不同於在C. scanf您需要在空間明確地讀取,因此改變readf("%d", &n)readf("%d ", &n),它應該工作(希望)。

下面是安德烈,誰實現的功能報價:

這是由設計。該示例工作時修改如下:

import std.stdio;

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

第二個參數之前的空格告訴readf在嘗試轉換之前讀取並跳過所有的 空白。

爲了提高其精度,我已經實現了readf是一個比scanf更多納粹關於空格 的公平數額。 Scanf一直是 着名難以用於複雜的輸入分析和驗證, 和我歸因於其對 空白的自由放任態度的一部分。如果有足夠的證據表明服務用戶的大部分 ,我很樂意放鬆一些readf對精確的 空白處理的堅持。我個人認爲,目前的行爲(默認嚴格爲 ,容易放鬆)是最好的。

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