[your code here]

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Apr 17 21:48:43 PDT 2012


On Wed, Apr 18, 2012 at 05:35:24AM +0200, jerro wrote:
[...]
> There is a bug in this code. If a line is longer then width but
> doesn't contain spaces, find will return an empty range and the
> length of line will not decrease on each while loop iteration. So
> there is an endless loop.

You're right, I forgot about that case. Here's the fixed code:

---------------------------------snip--------------------------------
// Wraps long lines in standard input.
// Demonstrates D's powerful array manipulation facility and generic
// algorithms.

import std.algorithm;
import std.array;
import std.range;
import std.stdio;

void main() {
	int width = 80;

	foreach (line; stdin.byLine()) {
		while (line.length > width) {
			// Find longest space-terminated prefix of line that
			// fits in width, and wrap it there.
			char[] fits = find(retro(line[0..width]), " ").source;
			if (fits.length==0) fits = line[0 .. width];
			writeln(fits);
			line = line[fits.length .. $];
		}

		writeln(line);
	}
}
---------------------------------snip--------------------------------

This code will forcefully truncate the line at width if no space is
found.

Thanks for finding the bug!


T

-- 
A mathematician is a device for turning coffee into theorems. -- P. Erdos


More information about the Digitalmars-d mailing list