6
import std.stdio;

void main(){

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

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

该文档只有一行解释readf()

uint readf(A...)(in 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);
}

第二个参数之前的空格告诉 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 回答