Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.albasani.net!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Eric Sosman Newsgroups: comp.lang.java.programmer Subject: Re: How can I read from the entire standard input at once? Date: Tue, 27 Sep 2011 22:39:07 -0400 Organization: A noiseless patient Spider Lines: 126 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Wed, 28 Sep 2011 02:40:36 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="f8igmItKsWs6nM5YanFxAA"; logging-data="26044"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19lXC9wmTklYhhPjYhg5L83" User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20110902 Thunderbird/6.0.2 In-Reply-To: Cancel-Lock: sha1:Gl7VfkRf+kMGciAZucDz3thZMyk= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:8378 On 9/27/2011 9:34 PM, Chad wrote: > The following code is a stripped down version of a large project. The > question is why do I have to press ctrl z every time to get the > output? That is, say I type the following at the command line > > 1 - 3 > > and then press the enter key on my keyboard. I press ctrl z and I get > 'The value is 1' . Then I press it again, I get a 'The value is '. > Then I press it again, I get 'The value is -', etc. Ideas on how to > get how get the entire output out at once? Ideally what I would like > to do is when I type in the above, press the enter key, then, after I > press ctrl z, get > > The value is 1 > The value is > found the minus sign > The value is 3 Is this a serious question, or are you trolling? Benefit of the doubt ... > import java.util.Scanner; > > public class hack { > > public static int getNextNumber(String [] storeValues) { > String value = null; > int i = 0; > Scanner input = new Scanner(System.in); > > while(input.hasNextLine()) { > > try { > storeValues[i++] = input.nextLine(); > } catch (IllegalStateException e) { > return -1; //EOF > } > } > > return 0; > } A few observations about this method. First, every time it's called it creates a brand-new Scanner reading System.in. If you call it twelve times you've got twelve Scanners all fighting over the same input source. I'm too revolted by the idea to spend time figuring out how the Scanners resolve their squabbles; it's like asking whether the tapeworms are more likely to exit the terminus of your gut head- or tail-first. I prefer not to know. Second, and take note of this in relation to the subsequent switch statement, this method returns either 0 or -1. Nothing else, not ever. Third, the getNextNumber name is not at all descriptive of what the method does. You might as well have called it getLost. > public static void main(String[] args) { > String[] values = new String[100]; > > char[] getNumber; > int value; > int i = 0; > while ( ( value = getNextNumber(values) ) != -1) { Since the method returns either 0 or -1, we know that if the program reaches this point we have `value' equal to 0. > getNumber = values[0].toCharArray(); Why? Have you never heard of String's charAt method? > switch (value) { > case 0: { > System.out.println("The value is " + getNumber[i]); > i++; > break; The switch statement selects this case every time. The first time around, it prints the first character (if there is one) of the first String (if there is one) read by the first Scanner, and ignores all the rest of the first String and any additional Strings the Scanner may have produced. The second time, it prints the second character (if there is one) of the first String (if there is one) read by the second Scanner (if it's able to read at all), ignoring all the rest of the input. The third time it outputs the third character of the third Scanner's first String, then the fourth time, ... > } Since `value' is zero, the remainder of the switch is irrelevant: None of it can ever be executed. > case '+': { > System.out.println("found plus sign"); > i++; > break; > } > case '-': { > System.out.println("found minus sign"); > i++; > break; > } > case '*': { > System.out.println("found mult sign"); > i++; > break; > } > case '/': { > System.out.println("found division sign"); > i++; > break; > } > default: break; > } > }//end while > > }//end main() The more I think about it, the more I think giving you the benefit of the doubt may have been foolhardy. Eleven to two you're trolling. -- Eric Sosman esosman@ieee-dot-org.invalid