1

所以我已经连续 10 个小时尝试编写这个加密程序,我认为我快要完成了,但我已经碰壁了。

当我用单个单词写时,一切正常,但是当我试图加密句子时,它就搞砸了。原因是当单词之间有空格时,不应该进行加密。我想我可以通过添加来轻松解决这个问题

if(vektor[k]== ' ') {
    k++;
}

我背后的想法是它检查 [k] 是否是空格,如果是,我将 +1 添加到 k,所以我跳到数组中的下一个插槽。但是我得到了 errormsg java.lang.ArrayIndexOutOfBoundsException,我认为这意味着我正在尝试在数组中寻找一个不存在的插槽,但我不知道它为什么这样做。

这是我的代码,希望它就是所需要的。

int k=0;
int Q=0;
while(x>0){

    if(Q>4){
        Q=0;     //resettar keyn till första bokstaven igen (räknar till 1-5)
    }

    vektor[k]=(char) (v[Q]+vektor[k]);
    if(vektor[k]>90){
        // System.out.println("STÖRRE ÄN 90 RESET");
        vektor[k]=(char)(vektor[k]-26);
    }

    Q++;
    System.out.print(vektor[k]);
    x--;
    k++;
    if(vektor[k]== ' '){
        vektor[k]='Ö';    
        k++;
    }

}

编辑

我决定添加一个新变量以确保我没有尝试脱离向量。当它开始工作时,我很高兴。但是当我尝试用两个空格加密文本时,加密失败。所以我想是的,我只需将 if(vektor[k]== ' ') 更改为一段时间。但由于某种原因它不起作用,我再次得到数组外错误。

这是我现在的代码,只要你在单词之间只有一个'',它就可以工作。

int y=x;
            int k=0;
            int Q=0;
            while(x>0 && y>k){ //hur funkar y>k delen xDDDDD

                if(vektor[k]== ' '){
                    k++;
                    }

                if(Q>4){
                    Q=0;    //resettar keyn till första bokstaven igen (räknar till 1-5)
                    }

                vektor[k]=(char) (v[Q]+vektor[k]);
                if(vektor[k]>90){
                //  System.out.println("STÖRRE ÄN 90 RESET");
                vektor[k]=(char)(vektor[k]-26);
                }

                Q++;
                System.out.print(vektor[k]);
                x--;
                k++;


            }
4

3 回答 3

0

您可以做的最快修复是在增加 k后检查它的值是否大于您的vektor.length

所以在这部分代码之后:

x--;
k++;

继续并添加:

if(k>=vektor.length) break;

在这部分之后:

vektor[k]='Ö';    
k++;

再次添加它(在 if 块内):

if(k>=vektor.length) break;

这意味着您将跳出while 循环。这只是一个没有得到异常的修复,你仍然应该检查你的代码的有效性(它按照它应该做的那样做)。

java.lang.ArrayIndexOutOfBoundsException

简而言之,它告诉您您正在尝试访问阵列的无效空间。当你创建你的数组时,你给它一个长度:

string[] vektor = new string[5];

如果你这样做vektor[5],你会得到异常,因为所述 vektor 的有效索引是 0、1、2、3、4(如果计算它们,则有 5 个。请记住,数组是 0 索引的,这意味着它们从 0 开始) .

于 2013-11-06T00:25:55.343 回答
0

看起来像是k在阵列之外;您需要添加一个k小于或等于向量长度的附加检查。

或者,如果您使用 x 作为 vektor 中剩余的元素数,那么只需确保x--k++.

在您的代码中:

int k=0;
int Q=0;
    while(x>0){

        if(Q>4){
            Q=0;    //resettar keyn till första bokstaven igen (räknar till 1-5)
            }

        vektor[k]=(char) (v[Q]+vektor[k]);
        if(vektor[k]>90){
        //  System.out.println("STÖRRE ÄN 90 RESET");
        vektor[k]=(char)(vektor[k]-26);
        }

        Q++;
        System.out.print(vektor[k]);
        x--;
        k++;
        if(vektor[k]== ' '){
        vektor[k]='Ö';  
    k++;
    x--;
        }

    }
于 2013-11-06T00:26:42.147 回答
0

通过这样做,如果是空格,您将跳过一个额外的字符,您将向前跳转到数组中不存在的位置。

k++;
if(vektor[k]== ' '){
    vektor[k]='Ö';    
    k++;
}

通常,这将每次递增,但在空格的实例上,它将通过引起跳跃来递增k,例如,在最后一个字符的实例中,现在将检查最后一个字符之后的第一个字符。1k2

我建议简单地将if语句移到您的增量之上。

if(vektor[k]== ' '){
    vektor[k]='Ö';    
}    
Q++;
System.out.print(vektor[k]);
x--;

k++;

例如,如果您的输入是test test. 您的代码将运行良好,直到最后一个字符t才会对其进行加密。代码要做的下一件事是增加它,现在您的索引超出范围,然后它会调用if(vektor[k]== ' ')将返回ArrayOutOfBoundsException,因为您已经到达输入的末尾,增加并再次检查。

于 2013-11-06T00:27:18.713 回答