My basic encrypt/uncrypt program... break; breaks when not supposed 2 in java
ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
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.");
}
}
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.
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).
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.
// 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.
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.