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