LinuxQuestions.org
Latest LQ Deal: Latest LQ Deals
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 01-14-2004, 05:19 PM   #1
Laptop2250
Member
 
Registered: Oct 2003
Posts: 131

Rep: Reputation: 15
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.");
    }

}
 
Old 01-14-2004, 10:46 PM   #2
jailbait
LQ Guru
 
Registered: Feb 2003
Location: Virginia, USA
Distribution: Debian 12
Posts: 8,337

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

Steve Stites

Last edited by jailbait; 01-14-2004 at 10:51 PM.
 
Old 01-14-2004, 11:12 PM   #3
megaspaz
Senior Member
 
Registered: Nov 2002
Location: Silly Con Valley
Distribution: Red Hat 7.3, Red Hat 9.0
Posts: 2,054

Rep: Reputation: 46
edited out an even wronger answer....

Last edited by megaspaz; 01-15-2004 at 01:48 AM.
 
Old 01-14-2004, 11:18 PM   #4
coolman0stress
Member
 
Registered: Jun 2003
Location: Toronto, Ontario, Canada
Posts: 288

Rep: Reputation: 30
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.

Last edited by coolman0stress; 01-14-2004 at 11:19 PM.
 
Old 01-15-2004, 05:42 PM   #5
Laptop2250
Member
 
Registered: Oct 2003
Posts: 131

Original Poster
Rep: Reputation: 15
huh?

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

Last edited by Laptop2250; 01-15-2004 at 05:43 PM.
 
Old 01-15-2004, 10:04 PM   #6
coolman0stress
Member
 
Registered: Jun 2003
Location: Toronto, Ontario, Canada
Posts: 288

Rep: Reputation: 30
Can you post your EasyReader class?
 
Old 01-16-2004, 01:44 AM   #7
nephilim
Member
 
Registered: Aug 2003
Location: Belgium
Distribution: Debian (server), Kubuntu (desktop)
Posts: 248

Rep: Reputation: 30
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.

Last edited by nephilim; 01-16-2004 at 01:47 AM.
 
Old 01-16-2004, 11:05 AM   #8
coolman0stress
Member
 
Registered: Jun 2003
Location: Toronto, Ontario, Canada
Posts: 288

Rep: Reputation: 30
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.

Last edited by coolman0stress; 01-16-2004 at 11:06 AM.
 
Old 01-20-2004, 09:14 PM   #9
Laptop2250
Member
 
Registered: Oct 2003
Posts: 131

Original Poster
Rep: Reputation: 15
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

Last edited by Laptop2250; 01-20-2004 at 09:15 PM.
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
encrypt and decrypt using encrypt(char block[64], int edflag) rockwell_001 Linux - Security 3 08-30-2009 09:16 AM
Some program to encrypt Folders maginotjr Slackware 5 09-20-2005 04:36 AM
Java breaks down each reboot. ljlabrie Linux - Software 1 11-19-2004 10:28 PM
Stop java program(threaded program..should end cleanly) rmanocha Programming 4 11-09-2004 09:36 AM
Visual Basic or Java figadiablo Programming 30 08-05-2003 10:52 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 04:32 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration