6
import std.stdio;

void main(){

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

最初の反復は機能し、出力されますnが、その後readf()は戻りません。

ドキュメントには、readf()次の説明が 1 行しかありません。

uint readf(A...)(char[] 形式、A args);

   For­mat­ted read one line from stdin.

私は何か間違ったことをしていますか?または何か問題がありreadf()ますか?標準入力から数字を読み取るだけです。

使用: DMD 2.054 64 ビット

4

1 に答える 1

9

readfこれは、Cとは異なる方法でスペースを処理するためだと思います。スペースscanfを明示的に読み取る必要があるため、に変更readf("%d", &n)するreadf("%d ", &n)と機能するはずです(うまくいけば)。

関数を実装したAndreiからの引用は次のとおりです。

これは仕様によるものです。この例は、次のように変更すると機能します。

std.stdioをインポートします。

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

2番目のパラメーターの前のスペースは、変換を試行する前にすべての空白を読み取ってスキップするように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

于 2011-08-19T13:32:32.117 に答える