On 03/16/2011 07:54 AM, Ali Çehreli wrote:
On 03/16/2011 05:49 AM, Kagamin wrote:
Ali ǥhreli Wrote:

The following program may be surprising to the novice:

import std.stdio;

void main()
{
write("What is your name? ");
string name = readln();
writeln("Hi ", name, "!");
}

What if the user typed leading spaces? Will the program operate as you
expect?

I would not like the leading spaces either, and that's another issue:
contrary to readln(), readf() leaves the newline character in the input.
I was about to start adopting the guideline of using " %s" (note the
space) when reading formatted unless there is a reason not to. Most of
the time the newline left from the previous input has nothing to do with
the next read.

Otherwise the following program gets stuck:

import std.stdio;

void main()
{
int i, j;
readf("%s%s", &i, &j);
}

As a result, my current guideline is "put a space before every format
specifier":

readf(" %s %s", &i, &j);

This is a departure from C's scanf but is more consistent.

I don't want to accept and teach buggy behavior and that's why I asked
on the D forum. Unfortunately I failed to attract interest there.

After accepting the above, I wanted to readf() lines too:

import std.stdio;

void main()
{
string s;
readf(" %s", &s);
writeln(s);
}

As another departure from C, readf() does not stop at the first
whitespace. It reads until the end of the input. Ok, I like that
behavior but it's not useful for "What is your name? " like inputs.

So it led me to readln().

I don't have a problem with whitespace being left in the line, I just
want to know whether that's the intended or accepted behavior.

Ali

I think there are two issues here. First, I think is perfectly reasonable to let the programmer use a simple mechanism like "string.chomp(stdin.readline())" or simply "chomp(readln())" when they don't want the new line.

Second, D doesn't seem to have a graceful way of reading an endless stream of <your favorite data type> delimited by <your favorite delimiting character>. I think readf is rigid, and works great in some cases. I would greatly appreciate something more flexible like C++'s extraction operator (operator>>) though. For example:
int i = 0;
while(cin >> i)
{
    //Do something
}
// Done doing something

Reply via email to