为什么readf没有按预期运行?

时间:2011-08-19 08:14:50

标签: d dmd

import std.stdio;

void main(){

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

第一次迭代有效,它打印n,但之后readf()永远不会返回。

文档只有一行解释readf()

  

uint readf(A ...)(以char []格式,A args);

   For­mat­ted read one line from stdin.

我做错了吗?或readf()有什么问题吗?我只需要从标准输入中读取数字。

使用:DMD 2.054 64位

1 个答案:

答案 0 :(得分:9)

我认为这是因为readf处理空格的方式与C中的scanf不同。您需要明确读取空格,因此将readf("%d", &n)更改为readf("%d ", &n)并且它应该有效(希望)。

这是Andrei的一句话,他实现了这个功能:

  

这是设计的。修改后的示例如下:

     

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