D lang-在同一程序中使用read和readln()

D lang-在同一程序中使用read和readln(),d,D,我对D程序有一个很奇怪的问题。read(“%s”,variable)本身可以正常工作,readln(variable)本身也可以正常工作,但是当我把两者放在一起时,readln()似乎被忽略了。使用gdc和dmd时发生错误 import std.stdio; import std.string; void main() { int x; write("Enter a number: "); readf(" %s", &x); write("What i

我对D程序有一个很奇怪的问题。read(“%s”,variable)本身可以正常工作,readln(variable)本身也可以正常工作,但是当我把两者放在一起时,readln()似乎被忽略了。使用gdc和dmd时发生错误

import std.stdio;
import std.string;

void main()
{
    int x;
    write("Enter a number: ");
    readf(" %s", &x);

    write("What is your name? ");
    string name=chomp(readln());

    writeln("Hello ", name, "!");
}
输出:

Enter a number: 5
What is your name? Hello !
但是,如果我注释掉readf(“%s”、&x),则readln将按我的意愿调用:

Enter a number: What is your name? hjl
Hello hjl!

这也是C中readf和scanf函数的一个常见错误。readf对于格式字符串和空白非常精确。当您的字符串出现时,它读取值,然后在看到的第一个空格处停止。。。这正好是新线

如果要这样做:

Enter a number: 123 bill
它会打印出你叫什么名字?你好,比尔因为它在空格处停止,然后readln将其拾取,直到行尾

如果执行123,请按enter键,然后输入您的姓名,readf将在换行符处停止。。。然后readln将其作为空行提取

最简单的修复方法是告诉readf也使用换行符:

readf(" %s\n", &x);
然后readln将从一个空缓冲区开始,并能够得到它需要得到的东西