D can';t读取同一变量两次

D can';t读取同一变量两次,d,D,对于此简单代码: long l; readf("%d", &l); readf("%d", &l); 当我输入20作为第二个数字时,它抛出一个异常 exception: std.conv.ConvException@/usr/include/dlang/dmd/std/conv.d(1995): 从类型LockingExtreader转换为类型long时出现意外的“2” 为什么会发生这种情况?我做错了什么?在需要使用的第一行之后,缓冲区中仍然有一行新行 与我在这里写的内容类

对于此简单代码:

long l;
readf("%d", &l);
readf("%d", &l);
当我输入20作为第二个数字时,它抛出一个异常

exception: std.conv.ConvException@/usr/include/dlang/dmd/std/conv.d(1995): 
从类型LockingExtreader转换为类型long时出现意外的“2”


为什么会发生这种情况?我做错了什么?

在需要使用的第一行之后,缓冲区中仍然有一行新行

与我在这里写的内容类似:

同样的解决办法也应该有效

long l;
readf(" %d", &l); // note the leading space
writeln("Got ", l);
readf(" %d", &l); // and again
writeln("Got ", l);

这很有趣,因为它在C中使用scanf时工作得很好,而不执行此操作。是的,scanf会自动跳过前导空格。。。尽管它会在缓冲区中留下一个尾随的换行符(尝试在调用
scanf
之后立即调用
fgets
,并注意它如何立即返回一个空行..)。readf没有,但是里面的空间可以做到。顺便说一句,这就是为什么我喜欢告诉D中的人们不要害怕直接调用他们知道的C函数的原因之一,因为它们仍然以完全相同的方式工作。