String Return Method

So, I am making a simple encryption program in Java. The user enters a string (strTarget), and then this string is taken with this function. In a for loop, it should take the value of the ASCII character, reduce it by 4, and then return it to the string (this is done for all characters in the string). As you see my friends, I already did this, however I'm not sure how to restore the string I want to return (for example, if the user enters "efg", the returned string should be "abc")

So, here is the result I got with the suggestions. I'm obviously doing something wrong in the menu class, not sure what it is. It stops working when I enter a string that should be encrypted.

import java.util.Scanner; public class Menu { public static String strTarget; public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out .println("Welcome to the encr/decr program"); System.out .println("To encrypt a string, press 1, to decrypt a string, press 2"); int choice = in.nextInt(); if (choice == 1) { System.out.println("Type the string you want to encrypt."); strTarget = in.next(); System.out.println(Encrypt(strTarget)); } if (choice == 2) { System.out.println("Enter the string you want to decrypt."); } } private static String Encrypt(String strTarget) { // TODO Auto-generated method stub int len = strTarget.length()-1; String destination = ""; for (int i = 0; i<len; i++) { if (strTarget.charAt(i) != ' ') { char a = strTarget.charAt(i); int b = (int) a; b = strTarget.charAt(i)-4; a = (char) b; if ( b<70 && b>64) { b = strTarget.charAt(i)+26; a = (char) b; destination += a; } } } return destination; 

}}

EDIT: Added full program.

 import java.util.Scanner; public class Menu { public static String strTarget; public static String destination = ""; public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Welcome to the encr/decr program"); System.out.println("To encrypt a string, press 1, to decrypt a string, press 2"); int choice = in.nextInt(); if (choice == 1) { System.out.println("Type the string you want to encrypt."); strTarget = in.next(); StringBuilder zomg = new StringBuilder(strTarget); System.out.println(Encrypt(zomg)); } if (choice == 2) { System.out.println("Enter the string you want to decrypt."); } 

}

  private static String Encrypt(StringBuilder zomg) { // TODO Auto-generated method stub int len = strTarget.length()-1; for (int i = 0; i<len; i++) { if (strTarget.charAt(i) != ' ') { char a = strTarget.charAt(i); int b = (int) a; b = strTarget.charAt(i)-4; a = (char) b; destination += a; if ( b<70 && b>65) { b = strTarget.charAt(i)+26; a = (char) b; destination += a; } } } System.out.println(destination); return destination; 

}}

I made the changes you said (I think) and it starts to work, but it does not work as intended. Gives some results, which, apparently, do not make sense (for "A", it returns =, for "V", it returns "V"). Any suggestions?

+4
source share
6 answers

Just add each converted character to a StringBuilder or StringBuffer .

+2
source

Here is a recursive solution:

You want to call it Encrypt(string,0)

 private static String Encrypt(String strTarget, int place) { // TODO Auto-generated method stub if (place==strTarget.length()) { return strTarget; } if (strTarget.charAt(place) != ' ') { char a = strTarget.charAt(place); int b = (int) a; b = strTarget.charAt(place)-4; a = (char) b; if ( b<70 && b>64) { b = strTarget.charAt(place)+26; a = (char) b; } return Encrypt(strTarget.substring(0,place)+a+strTarget.substring(place+1,strTarget.length()),place+1); } return null; } 
+2
source
 private static String Encrypt(String strTarget) { // TODO Auto-generated method stub int len = strTarget.length()-1; String destination = ""; for (int i = 0; i<len; i++) { if (strTarget.charAt(i) != ' ') { char a = strTarget.charAt(i); int b = (int) a; b = strTarget.charAt(i)-4; a = (char) b; if ( b<70 && b>64) { b = strTarget.charAt(i)+26; a = (char) b; destination += a; } } return destination; } 

I added a new line called destination , added characters to it, and returned it.

EDIT

However, it seems that you can change the actual String , strTarget .

To do this, you should not pass strTarget as your parameter, because it passes it by value, not by reference.

To actually change the string, pass a StringBuilder as described here . (By the way, here is a link.)

EDIT No. 2

Say you have a method. Call him foo . Foo takes an int as a parameter and sets it to 1:

 public static void foo(int i) { i = 1; } 

Now you want to test your method:

 public static void main(String[] args) { int i = 0; foo(i); System.out.println(i); } 

This should print 1, right? NO This is not true. It prints "0" . You can check it out if you want. This is because the integer is "passed by value". When something is passed by value, the virtual machine basically makes a copy and passes the copy to the method.

Therefore, when you execute i=1 in your foo method, you actually set the copy of i to 1 , not i . Thus, i remains unchanged.

There is another type of parameter passing called pass by reference. When something is passed by reference, the method changes the actual variable.

Arrays, for example, are passed by reference. Take this code, for example:

 public static void foo(int[] i) { i[0] = 1; // i must have at least one element. } public static void main(String[] args) { int[] i = new int[1]; foo(i); System.out.println(i[0]); } 

In this example, i changes to foo because it is passed by reference.

In the original method, you return the return type as void . If the return type is not valid, you cannot return the encrypted String . So it occurred to me that perhaps you had to follow the link and change strTarget .

To do this, instead of passing strTarget you must pass a StringBuilder . You must create it using new StringBuilder(strTarget) , and it will automatically be pass by reference . If you wanted this, then I would like to create a destination String (as described above) and then change the StringBuilder to change strTarget to destination String .

Hope this helps.

0
source

You might want to try something like the following:

 private static String encrypt(String strTarget) { char[] chars = strTarget.toCharArray(); for(int i=0; i<chars.length; i++) { if(chars[i] != ' ') { int asciiVal = chars[i]; asciiVal -= 4; if(asciiVal < 70 && asciiVal > 64) { asciiVal += 26; } chars[i] = (char) asciiVal; } } return String.valueOf(chars); } 
0
source

A readable, more object-oriented version using some magical magic:

 private static final int MOD_ALPHABET = 'Z' - 'A' + 1; private static String rot(int rot, String toEncrypt) { int rangedRot = rot % MOD_ALPHABET; if (rangedRot < 0) { rangedRot = MOD_ALPHABET + rangedRot; } final StringBuilder sb = new StringBuilder(toEncrypt); for (int i = 0; i < sb.length(); i++) { final char plainChar = sb.charAt(i); final char startChar; if (plainChar >= 'A' && plainChar <= 'Z') { startChar = 'A'; } else if (plainChar >= 'a' && plainChar <= 'z') { startChar = 'a'; } else { continue; } char cryptChar = (char) (plainChar - startChar); cryptChar += rangedRot; cryptChar %= MOD_ALPHABET; cryptChar += startChar; sb.setCharAt(i, cryptChar); } return sb.toString(); } 
0
source

Initialize an empty line before the for loop:

 String target = ""; 

Inside, if you do the following:

 target += a; 

Do it do it!

 return target; 
-1
source

Source: https://habr.com/ru/post/1389968/


All Articles