为什么 readf 的行为不符合预期?

发布于 2024-11-30 12:33:54 字数 437 浏览 0 评论 0原文

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 参数);

 格式化从标准输入读取一行。

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

使用:DMD 2.054 64 位

import std.stdio;

void main(){

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

The first iteration works, and it prints n, but after that readf() never returns.

The documentation has only a single line explaining readf():

uint readf(A...)(in char[] for­mat, A args);

   For­mat­ted read one line from stdin.

Am I do something wrong? or is there something wrong with readf()? I just need to read numbers from the standard input.

using: DMD 2.054 64-bit

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等待我真够勒 2024-12-07 12:33:54

我相信这是因为 readf 处理空格的方式与 C 中的 scanf 不同。您需要显式读取空格,因此更改 readf("%d", & n)readf("%d ", &n) 它应该可以工作(希望如此)。

以下是实现该功能的 Andrei 的一句话:

这是设计使然。该示例在修改后有效:

导入std.stdio;

无效主() {
整数 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

I believe it's because readf handles spaces differently than scanf in C. You need to explicitly read in the spaces, so change readf("%d", &n) to readf("%d ", &n) and it should work (hopefully).

Here's a quote from Andrei, who implemented the function:

This is by design. The example works when modified as follows:

import std.stdio;

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

The space before the second parameter tells readf to read and skip all
whitespace before attempting conversion.

I've implemented readf to be a fair amount more Nazi about whitespace
than scanf in an attempt to improve its precision. Scanf has been
famously difficult to use for complex input parsing and validation,
and I attribute some of that to its laissez-faire attitude toward
whitespace. I'd be glad to relax some of readf's insistence on precise
whitespace handling if there's enough evidence that that serves most
of our users. I personally believe that the current behavior (strict
by default, easy to relax) is best.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文