我对D程序有一个非常奇怪的问题.read("%s",变量)本身工作正常,readln(变量)本身工作正常,但是当我把两者放在一起时,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, "!");
}
Run Code Online (Sandbox Code Playgroud)
输出:
Enter a number: 5
What is your name? Hello !
Run Code Online (Sandbox Code Playgroud)
但是,如果我注释掉readf("%s",&x),则按照我的意愿调用readln:
Enter a number: What is your name? hjl
Hello hjl!
Run Code Online (Sandbox Code Playgroud)
这也是来自C的readf和scanf函数的常见错误.readf非常精确的格式字符串和空格.使用你的字符串,它会读取值,然后在它看到的第一个空格处停止...这恰好是换行符.
如果你这样做:
Enter a number: 123 bill
Run Code Online (Sandbox Code Playgroud)
它会打印,What is your name? Hello bill!
因为它停在空间,然后读取它直到行尾.
如果您执行123,请按Enter键,然后输入您的姓名,readf将停止在换行符处......然后,readln将作为空行拾取.
最简单的解决方法是告诉readf也使用换行符:
readf(" %s\n", &x);
Run Code Online (Sandbox Code Playgroud)
然后readln将从一个空缓冲区开始,并能够获得它需要得到的东西.