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

时间:2014-07-23 01:29:43

标签: d

我对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, "!");
}

输出:

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

但是,如果我注释掉readf("%s",& x),则按照我的意愿调用readln:

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

1 个答案:

答案 0 :(得分:7)

这也是来自C的readf和scanf函数的常见错误。 readf非常精确的格式字符串和空格。使用你的字符串,它会读取值然后在它看到的第一个空格处停止...这恰好是换行符。

如果你这样做:

Enter a number: 123 bill

它会打印What is your name? Hello bill!,因为它在空格处停止,然后读取它直到行尾。

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

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

readf(" %s\n", &x);

然后readln将从一个空缓冲区开始,并能够获得它需要得到的东西。