LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   My basic encrypt/uncrypt program... break; breaks when not supposed 2 in java (https://www.linuxquestions.org/questions/programming-9/my-basic-encrypt-uncrypt-program-break%3B-breaks-when-not-supposed-2-in-java-134857/)

Laptop2250 01-14-2004 05:19 PM

My basic encrypt/uncrypt program... break; breaks when not supposed 2 in java
 
Hey, I wrote this... I don't see anything wrong with it, I asked other ppl and they don't see anything wrong with it, do any of you?

When I run this everything seems to work, but if I enter choice 1, nothing happens, the program loops.

If I enter choice 2 I get the output (I deleted a few blank lines 2 make it look better)
Code:

1 Encrypt
 2 Decrypt
 3 Quit
Enter choice:
2
Enter uncrypted text:
 1 Encrypt
 2 Decrypt
 3 Quit
Enter choice:

And it loops... ????

If I enter choice 3, it succesfully quits the program. I think the only problem could be is the break; (breaks the loop) but it breaks the loop if is in if statement and it is.

Can somebody tell me how to fix this.
Code:

public class Encrypt {
 
  public static void main(String[] args) {
        EasyReader n= new EasyReader();
        String alpha = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String codon = "o+_@#)e($*&{}/[i]-u=`<?>a!U";
        String temp="";  // will hold the new string being constructed
        int choice=0;

        while (choice != 3) {
        System.out.println (" 1 Encrypt \n 2 Decrypt \n 3 Quit");
        System.out.println ("Enter choice: ");
        choice= n.readInt();
       
        if (choice == 3) {
            break;
                          }
                         
        else if(choice == 2) {
          System.out.println ("Enter uncrypted text:\n");
          String s = n.readLine();
              for(int i=0; i< s.length(); i++) { // go through every character in alpha
                  temp=(temp+codon.charAt(alpha.indexOf(s.charAt(i))));  // a longer but clearer version of this line is below
                                              }
                  s=temp;
                  System.out.println(s);
                          }
       
        else if(choice == 1) {
          System.out.println ("Enter uncrypted text:\n");
          String s = n.readLine();
              for(int i=0; i< s.length(); i++) { // go through every character in alpha
                  temp=(temp+alpha.charAt(codon.indexOf(s.charAt(i))));  // a longer but clearer version of this line is below
                                              }
                  s=temp;
                  System.out.println(s);             
                        }
                            } //end of while loop
        System.out.println ("Quit.");
    }

}


jailbait 01-14-2004 10:46 PM

I edited out an incorrect answer.
___________________________________
Be prepared. Create a LifeBoat CD.
http://users.rcn.com/srstites/LifeBo...home.page.html

Steve Stites

megaspaz 01-14-2004 11:12 PM

edited out an even wronger answer.... :o

coolman0stress 01-14-2004 11:18 PM

When you read the choice, you press enter so the newline is left in the buffer, so when you try to read a string in choice 2, you get that remaining newline and you never get the chance to input anything new.

Laptop2250 01-15-2004 05:42 PM

huh?

But I made string s= newline. So why would int choice affect it? (if thats what u meant)

coolman0stress 01-15-2004 10:04 PM

Can you post your EasyReader class?

nephilim 01-16-2004 01:44 AM

Re: My basic encrypt/uncrypt program... break; breaks when not supposed 2 in java
 
I ran your code through my debugger. I didn't have your EasyReader class of course, so I changed
Code:

EasyReader n = new EasyReader();
to
Code:

BufferedReader n = new InputStreamReader(System.in);
and then parsed the String to int where necessary.

The code didn't loop on my machine, what I did notice was that you don't empty temp on a new loop. So if the user types "test" the first time, temp will be filled with let's say *!^* (just an example - it will be different when you try it). If you want to try something else, temp still contains this encoded string and the next string will simply be added to temp (resulting in wrong output).

So you should add
Code:

while (choice != 3) {
    temp = "";
    System.out.println (" 1 Encrypt \n 2 Decrypt \n 3 Quit");
    System.out.println ("Enter choice: ");
    choice= n.readInt();

But this still doesn't explain why the program loops.

coolman0stress 01-16-2004 11:05 AM

Quote:

BufferedReader n = new InputStreamReader(System.in);
You forgot something, should be:
Code:

BufferedReader n = new BufferedReader(new InputStreamReader(System.in));
For the parsing of ints, use:
Code:

choice= Integer.parseInt(n.readLine());
Dealing with String input is much easier generally than reading specific datatypes.

Also, like nephilim mentioned, you need to reset temp after encrypting/decrpting

Going back to the original problem of looping, if you were to check what's actually being read into choice, you would see the problem:

Code:

DataInputStream n = new DataInputStream(System.in);
int choice = 0;
while(choice!=3) {
  System.out.println(" 1 Encrypt \n 2 Decrpty \n 3 Quit");
  System.out.println("Enter choice: ");
  choice = n.readInt();
  System.out.println("You entered: " + choice);

  // ...

You will notice that the number you entered isn't the number choice holds, so it can never enter one of your choice ifs, it will always loop. Those new lines you got aren't a coincedence either.

So you're better of using a BufferedReader and it's readLine(), then parsing to an int whenever you need to.

Laptop2250 01-20-2004 09:14 PM

Sorry for my late reply coolman0stress. Here ya go, also available at http://www.skylit.com/javamethods/appxe.html
Code:

// package com.skylit.io;
import java.io.*;

/**
 *  @author Gary Litvin
 *  @version 1.2, 5/30/02
 *
 *  Written as part of
 *
 *  <i>Java Methods: An Introduction to Object-Oriented Programming</i>
 *  (Skylight Publishing 2001, ISBN 0-9654853-7-4)
 *
 *  and
 *
 *  <i>Java Methods AB: Data Structures</i>
 *  (Skylight Publishing 2003, ISBN 0-9654853-1-5)
 *
 *  EasyReader provides simple methods for reading the console and
 *  for opening and reading text files.  All exceptions are handled
 *  inside the class and are hidden from the user.
 *
 *  <xmp>
 *  Example:
 *  =======
 *
 *  EasyReader console = new EasyReader();
 *  System.out.print("Enter input file name: ");
 *  String fileName = console.readLine();
 *
 *  EasyReader inFile = new EasyReader(fileName);
 *  if (inFile.bad())
 *  {
 *    System.err.println("Can't open " + fileName);
 *    System.exit(1);
 *  }
 *
 *  String firstLine = inFile.readLine();
 *  if (!inFile.eof())  // or:  if (firstLine != null)
 *    System.out.println("The first line is : " + firstLine);
 *
 *  System.out.print("Enter the maximum number of integers to read: ");
 *  int maxCount = console.readInt();
 *  int k, count = 0;
 *
 *  while (count < maxCount && !inFile.eof())
 *  {
 *    k = inFile.readInt();
 *    if (!inFile.eof())
 *    {
 *      // process or store this number
 *      count++;
 *    }
 *  }
 *
 *  inFile.close();    // optional
 *  System.out.println(count + " numbers read");
 *  </xmp>
 *
 */

public class EasyReader
{
  protected String myFileName;
  protected BufferedReader myInFile;
  protected int myErrorFlags = 0;
  protected static final int OPENERROR = 0x0001;
  protected static final int CLOSEERROR = 0x0002;
  protected static final int READERROR = 0x0004;
  protected static final int EOF = 0x0100;

  /**
  *  Constructor.  Prepares console (System.in) for reading
  */
  public EasyReader()
  {
    myFileName = null;
    myErrorFlags = 0;
    myInFile = new BufferedReader(
                            new InputStreamReader(System.in), 128);
  }

  /**
  *  Constructor.  opens a file for reading
  *  @param fileName the name or pathname of the file
  */
  public EasyReader(String fileName)
  {
    myFileName = fileName;
    myErrorFlags = 0;
    try
    {
      myInFile = new BufferedReader(new FileReader(fileName), 1024);
    }
    catch (FileNotFoundException e)
    {
      myErrorFlags |= OPENERROR;
      myFileName = null;
    }
  }

  /**
  *  Closes the file
  */
  public void close()
  {
    if (myFileName == null)
      return;
    try
    {
      myInFile.close();
    }
    catch (IOException e)
    {
      System.err.println("Error closing " + myFileName + "\n");
      myErrorFlags |= CLOSEERROR;
    }
  }

  /**
  *  Checks the status of the file
  *  @return true if en error occurred opening or reading the file,
  *  false otherwise
  */
  public boolean bad()
  {
    return myErrorFlags != 0;
  }

  /**
  *  Checks the EOF status of the file
  *  @return true if EOF was encountered in the previous read
  *  operation, false otherwise
  */
  public boolean eof()
  {
    return (myErrorFlags & EOF) != 0;
  }

  private boolean ready() throws IOException
  {
    return myFileName == null || myInFile.ready();
  }

  /**
  *  Reads the next character from a file (any character including
  *  a space or a newline character).
  *  @return character read or <code>null</code> character
  *  (Unicode 0) if trying to read beyond the EOF
  */
  public char readChar()
  {
    char ch = '\u0000';

    try
    {
      if (ready())
      {
        ch = (char)myInFile.read();
      }
    }
    catch (IOException e)
    {
      if (myFileName != null)
        System.err.println("Error reading " + myFileName + "\n");
      myErrorFlags |= READERROR;
    }

    if (ch == '\u0000')
      myErrorFlags |= EOF;

    return ch;
  }

  /**
  *  Reads from the current position in the file up to and including
  *  the next newline character.  The newline character is thrown away
  *  @return the read string (excluding the newline character) or
  *  null if trying to read beyond the EOF
  */
  public String readLine()
  {
    String s = null;

    try
    {
      s = myInFile.readLine();
    }
    catch (IOException e)
    {
      if (myFileName != null)
        System.err.println("Error reading " + myFileName + "\n");
      myErrorFlags |= READERROR;
    }

    if (s == null)
      myErrorFlags |= EOF;
    return s;
  }

  /**
  *  Skips whitespace and reads the next word (a string of consecutive
  *  non-whitespace characters (up to but excluding the next space,
  *  newline, etc.)
  *  @return the read string or null if trying to read beyond the EOF
  */
  public String readWord()
  {
    StringBuffer buffer = new StringBuffer(128);
    char ch = ' ';
    int count = 0;
    String s = null;

    try
    {
      while (ready() && Character.isWhitespace(ch))
        ch = (char)myInFile.read();
      while (ready() && !Character.isWhitespace(ch))
      {
        count++;
        buffer.append(ch);
        myInFile.mark(1);
        ch = (char)myInFile.read();
      };

      if (count > 0)
      {
        myInFile.reset();
        s = buffer.toString();
      }
      else
      {
        myErrorFlags |= EOF;
      }
    }

    catch (IOException e)
    {
      if (myFileName != null)
        System.err.println("Error reading " + myFileName + "\n");
      myErrorFlags |= READERROR;
    }

    return s;
  }

  /**
  *  Reads the next integer (without validating its format)
  *  @return the integer read or 0 if trying to read beyond the EOF
  */
  public int readInt()
  {
    String s = readWord();
    if (s != null)
      return Integer.parseInt(s);
    else
      return 0;
  }

  /**
  *  Reads the next double (without validating its format)
  *  @return the number read or 0 if trying to read beyond the EOF
  */
  public double readDouble()
  {
    String s = readWord();
    if (s != null)
      return Double.parseDouble(s);
      // in Java 1, use: return Double.valueOf(s).doubleValue();
    else
      return 0.0;
  }
}

*added code tags in edit


All times are GMT -5. The time now is 09:17 AM.