readf with strings

Ali Çehreli acehreli at yahoo.com
Wed Jun 22 08:30:02 PDT 2011


On Wed, 22 Jun 2011 14:57:57 +0000, GreatEmerald wrote:

> This should be a very elementary question. How do you get a string off
> stdin? Or an integer, or a boolean, for that matter? If I use this:
> 
>   float MyFloat;
>   string MyString;
>   readf("%f", &MyFloat);
>   writeln(MyFloat);
>   readf("%s", &MyString);
>   writeln(MyString);
> 
> I get the float printed correctly, but when it asks to input the string,
> whatever I input gets ignored - I can't reach the writeln part in any
> way and I have to forcibly close the program. The same thing is with
> ints - if I enter an int, it acts as if I didn't enter anything at all.
> But floats work fine for some reason. Any thoughts about what is
> happening there?
> 
> I'm using openSUSE 11.4 and DMD 2.053.

Reading from an input stream is sometimes confusing.

Things to remember:

- Use %s for any type unless there is reason not to

- The line terminator from the previous entry is still in the input. (You 
may call readf(" ") to flush those white space characters. (I've just 
discovered this.))

- string can hold any character including space and the line terminator. 
That's why pressing the Enter doesn't terminate reading a string.

- Use a space character before any format specifier to ignore zero or 
more whitespace characters before the previous input: " %s".

- To read a string (actually a line), use chomp(readln())

- I don't know whether this is intended and I don't think that we should 
routinely use this: The EOF (Ctrl-D on Unix consoles, Ctrl-Z on Windows) 
terminates reading the string but strangely not the entire input.

import std.stdio;
import std.string;

void main()
{
    float MyFloat;
    readf(" %s", &MyFloat);
    writeln(MyFloat);

    readf(" ");

    string MyString = chomp(readln());
    writeln(MyString);
}

Ali


More information about the Digitalmars-d-learn mailing list