On Fri, 17 Mar 2017 03:55:26 +0000, Jordan Wilson wrote: > Hello Phil, > > I think there might be an issue with this function here: snip > I get an infinate loop if I put in something that's not convertible to > an integer. I think what happens is that you catch the exception, the > input still remains (presumably the buffer/range it's reading from > hasn't had the chance to iterate through because of the thrown > exception), and readf will always try and convert the input again. > > I'd probably rewrite it as this: > > int inputInt ( string prompt ){ > import std.range : popBack; writeln( prompt ~ "? "); > > string line; > while ((line = readln) !is null){ > line.popBack; // remove line terminator try { > return line.to!int; > } catch (Exception e) { > writeln ("? "); > } > } > assert(0); > } > > Thanks, > Jordan
Jordan, I don't see an infinite loop, but I do see one failure and prompt printed for each character on the line that doesn't parse. I added a readline to the catch so that the input should be emptied when the parse fails. Does that fix your infinite loop? I tried your proposed fix and it works the same as adding the readline for me. Thanks for taking the time to help, Phil