我正在开发一款使用古老的Caesar Cipher加密一串文字的Android应用程序。
更具体地说,用户将在EditText视图中键入任意长度的字符串,然后按下将加密文本字符串的按钮。按下按钮时,必须加密字符串,然后将其打印到TextView上。
这是我的MainActivity类(它不完整):
public class MainActivity extends AppCompatActivity {
EditText TextToMirror;
TextView TextOut;
Button Mirrorbtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextToMirror = (EditText) findViewById(R.id.TextToMirror);
TextOut = (TextView) findViewById(R.id.TextOut);
Mirrorbtn = (Button) findViewById(R.id.Mirrorbtn);
Mirrorbtn.setOnClickListener(new View.OnClickListener() {
/**The onClick method should get text from the edittext view,
* crypt that text using the crypt method from the ceasar chiper method and then
* print on the textview**/
@Override
public void onClick(View v) {
TextOut.setText(TextToMirror.getText());
}
});
}
//Trying to access the crypt method from the ceasar chiper class
public void cryptxt (){
CeasarCipher lock = new CeasarCipher();
lock.crypt();
}
}
这是Caesar密码类:
public class CeasarCipher {
public char crypt (char alpha){
switch (alpha){
case 'A' : return 'D';
case 'a' : return 'd';
case 'B' : return 'E';
case 'b' : return 'e';
case 'C' : return 'F';
case 'c' : return 'f';
case 'D' : return 'G';
case 'd' : return 'g';
case 'E' : return 'H';
case 'e' : return 'h';
case 'F' : return 'I';
case 'f' : return 'i';
case 'G' : return 'J';
case 'g' : return 'j';
case 'H' : return 'K';
case 'h' : return 'k';
case 'I' : return 'L';
case 'i' : return 'l';
case 'J' : return 'M';
case 'j' : return 'm';
case 'K' : return 'N';
case 'k' : return 'n';
case 'L' : return 'O';
case 'l' : return 'o';
case 'M' : return 'P';
case 'm' : return 'p';
case 'N' : return 'Q';
case 'n' : return 'q';
case 'O' : return 'R';
case 'o' : return 'r';
case 'P' : return 'S';
case 'p' : return 's';
case 'Q' : return 'T';
case 'q' : return 't';
case 'R' : return 'U';
case 'r' : return 'u';
case 'S' : return 'V';
case 's' : return 'v';
case 'T' : return 'W';
case 't' : return 'w';
case 'U' : return 'X';
case 'u' : return 'x';
case 'V' : return 'Y';
case 'v' : return 'y';
case 'W' : return 'Z';
case 'w' : return 'z';
case 'X' : return 'A';
case 'x' : return 'a';
case 'Y' : return 'B';
case 'y' : return 'b';
case 'Z' : return 'C';
case 'z' : return 'c';
default: return alpha;
}
}
}
好的,所以Caesar密码课程' job是扫描在应用程序的EditText视图中输入的文本字符串并加密字符串。 crypt (char alpha)
方法是按钮用来加密EditText View
中输入的字符串的方法。因此,crypt (char alpha)
类将通过在MainActivity
内创建CaesarCipher
对象来使用MainActivity
方法(请参阅上面的主要活动代码)。该对象允许我访问crypt
方法。
因此,过去几周一直困扰着我的问题是这种crypt
方法。由于它使用的是switch()
语句,因此我无法在crypttext
内的MainActivity
方法中调用该方法。这是因为crypttext
方法是一个void方法,crypt
方法包含一个返回值的switch语句。我非常清楚虚空意味着NO RETURN值!
我向你们提出的问题是:我如何调用一种在空洞方法中返回值的方法?我尝试从void
删除public void cryptxt ()
,但android工作室一直告诉我该方法名称无效'并且需要返回类型'。
请帮忙!
答案 0 :(得分:1)
你只需要这样做:
public class MainActivity extends AppCompatActivity {
EditText TextToMirror;
TextView TextOut;
Button Mirrorbtn;
CeasarCipher lock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextToMirror = (EditText) findViewById(R.id.TextToMirror);
TextOut = (TextView) findViewById(R.id.TextOut);
Mirrorbtn = (Button) findViewById(R.id.Mirrorbtn);
lock = new CeasarCipher();
Mirrorbtn.setOnClickListener(new View.OnClickListener() {
/**The onClick method should get text from the edittext view,
* crypt that text using the crypt method from the ceasar chiper method and then
* print on the textview**/
@Override
public void onClick(View v) {
String str = TextToMirror.getText().toString;
StringBuilder temp=new StringBuilder("");
for (int i = 0; i < str.length(); i++) {
temp.append(lock.crypt(str.charAt(i)));
}
TextOut.setText(temp);
}
});
}
答案 1 :(得分:0)
您问题的答案
HOW DO I CALL A METHOD THAT HAS TO RETURN A VALUE WITHIN A VOID METHOD?
不是,你不能这样打电话。 Java中的一个方法必须有一个返回类型,甚至可以是 void ,这意味着什么,但你必须在那里写,让编译器什么都不返回。
如果在你的情况下它返回,下面的方法也很有用。因为您要打印加密值,如果您返回 void ,则无法打印加密值,因此请将其更改为获取加密值。
public char cryptxt (char temp){
CeasarCipher lock = new CeasarCipher();
return lock.crypt(temp);
}
现在在呼叫方面就像这样打印。
@Override
public void onClick(View v) {
//use encrypted value
String str = TextToMirror.getText().toString;
for(int i=0; i<str.length();i++){
char ch = str.charAt(i);
char temp = cryptxt(ch)
TextOut.setText(temp);
}
}
答案 2 :(得分:0)
如果要调用方法返回某些内容(void
以外的方法),则需要对此方法返回的值执行某些操作,例如:
public int something() {
return 128;
}
public void nothing() {
int assignedReturnValue = something();
}
如您所见,something()
返回int
,我将该方法的结果分配给int
变量。如您所见,void
方法本身不返回任何内容,但它只是一个简单的示例,说明如何调用方法返回方法中返回任何内容的东西。
顺便说一下,我建议你将char
转换为int
s并添加到此转换值为3的结果,而不是创建非常长的switch
语句。您需要在简单的if-else
语句中处理它,以使其正常工作。
答案 3 :(得分:0)
这就是我创建的自定义函数,仅用于为字母表设置密码。 在其中我传递了我想要密码的字符串,而不是它返回转换后的密文。有关ASCII的更多详细信息,请参阅Alphabetical ASCII和More details about ASCII
我会帮助你。
#include<stdio.h>
#include<ctype.h>
main()
{
int num[10];
int i, j, cnt=0;
char rept;
printf("Enter 10 numbers: \n\n");
for(i=0; i<=9; i++)
{
printf("Number %d = ", i+1);
scanf("%d", &num[i]);
fflush(stdin);
if ( !isdigit(num[i]) )
{
printf("OK\n");
}
else
{
printf("Invalid number. Enter again.\n");
i=i-1;
}
}
do
{
printf("\nEnter the number to be searched in array: ");
scanf(" %d", &j);
for (i=0 ; i<=24; i++)
{
if(num[i]==j)
cnt++;
}
if(cnt>0)
printf("\nNumber %d is present at %d places", j, cnt);
else
printf("\nNumber not present.");
printf("\n\nDo you want to search another number. Press Y to repeat. Any other key to exit");
fflush(stdin);
scanf("%c", &rept);
}while (rept=='y'||rept=='Y');
getch();
}