简单java代码中的一些错误

简单java代码中的一些错误,java,io,Java,Io,这是一个简单的Java代码,它在不使用任何字符串API函数的情况下反转字符串,但在最后一行中,当它打印反转的字符串时,输出语句System.out.println中出现了一些问题 代码如下: class StringReverse { public static void main(String[] args) throws java.io.IOException { int str[] = new int[100]; int i=0,j;

这是一个简单的Java代码,它在不使用任何字符串API函数的情况下反转字符串,但在最后一行中,当它打印反转的字符串时,输出语句System.out.println中出现了一些问题

代码如下:

class StringReverse
{
    public static void main(String[] args) throws java.io.IOException
    {
        int str[] = new int[100];
        int i=0,j;
        System.out.println("Enter a string");
        while(true)
        {
            str[i]=System.in.read();
            if(str[i++]==13)
                break;
        }
        String reversed="",simple = new String(str,0,i-1);
        System.out.println(simple);

        // now reversing the string
        for(j=i-1;j>=0;j--)
            reversed+=((char)str[j]);
        System.out.println("String is "+reversed);
    }
}
样本输出为
这是因为您正在Windows上运行。按Enter键时,将传输两个特殊字符-,或\r,和,或\n*。您正在捕获\n,并停止读取。但是,\r保留在缓冲区中,并成为反转字符串的第一个字符。这就是为什么反向字符串会打印在输出字符串的顶部

下面是最后一步的情况:

字符串被打印出来;光标位于以零为基准的位置10 打印反向字符串gagan的第一个字符\r。字符不可见,但光标的位置变为零;光标保持在同一行上 反转的字符串nagag打印在字符串的Strin部分上 现在您可以看到输出nagagg是
*代表回车;表示换行。

这是因为您在Windows上运行。按Enter键时,将传输两个特殊字符-,或\r,和,或\n*。您正在捕获\n,并停止读取。但是,\r保留在缓冲区中,并成为反转字符串的第一个字符。这就是为什么反向字符串会打印在输出字符串的顶部

下面是最后一步的情况:

字符串被打印出来;光标位于以零为基准的位置10 打印反向字符串gagan的第一个字符\r。字符不可见,但光标的位置变为零;光标保持在同一行上 反转的字符串nagag打印在字符串的Strin部分上 现在您可以看到输出nagagg是
*代表回车;表示换行。

或者,您可以通过使用StringBuilder简单地实现这一点,而不必使用不需要的代码行。有关StringBuilder的更多信息,请访问:

下面是一个使用StringBuilder的实现

import java.lang.StringBuilder;
import java.util.Scanner;

public class ReverseString{
    public static void main(String[] args){
        //String s = getString("Please enter a string");
        //you can either pass the getString directly into the constructor of 
        //StringBuilder or first instanciated and pass that String.
        StringBuilder rev = new StringBuilder(getString("Please enter a String"));
        //A build-in method of the StringBuilder class that reverses a StringBuilder.
        StringBuilder k = rev.reverse();
        //A cmd print
        print("The reverse is: "+k);
    }

    public static String getString(String msg) {
        Scanner in = new Scanner(System.in);
        print(msg);
        String s = in.nextLine();
        return s;
    }

    public static void print(String s) {
        System.out.println(s);
    }
}

或者,您可以简单地使用StringBuilder,而不是使用不需要的代码行。有关StringBuilder的更多信息,请访问:

下面是一个使用StringBuilder的实现

import java.lang.StringBuilder;
import java.util.Scanner;

public class ReverseString{
    public static void main(String[] args){
        //String s = getString("Please enter a string");
        //you can either pass the getString directly into the constructor of 
        //StringBuilder or first instanciated and pass that String.
        StringBuilder rev = new StringBuilder(getString("Please enter a String"));
        //A build-in method of the StringBuilder class that reverses a StringBuilder.
        StringBuilder k = rev.reverse();
        //A cmd print
        print("The reverse is: "+k);
    }

    public static String getString(String msg) {
        Scanner in = new Scanner(System.in);
        print(msg);
        String s = in.nextLine();
        return s;
    }

    public static void print(String s) {
        System.out.println(s);
    }
}

当你用调试器,或者至少是一张纸和一支铅笔来处理这个问题时,发生了什么事?@kevin:如果你只是打印System.out.printlnreversed,没关系,但是如果你在这之前打印一些字符串,它会显示一个意外的输出,即,在该字符串之前打印“反转”literal@sotirios:第一个将字符串逐字符读入整数数组,第二个在回车时停止Enter@Gagan93这些不是问题,它们是线索=@sotirios:它在那一点上停止了,并没有造成任何问题,是morover typcasting导致了这种情况的发生。问题是在最后一行,当你用调试器,或者至少是一张纸和一支铅笔来处理这个问题时发生了什么?@kevin:如果你只是打印System.out.printlnreversed,它是可以的,但是如果你在这之前打印一些字符串,它会显示一个意外的输出,即,在该字符串之前打印“反转”literal@sotirios:第一个将字符串逐字符读入整数数组,第二个在回车时停止Enter@Gagan93这些不是问题,它们是线索=@sotirios:它在那一点上停止了,并没有造成任何问题,是morover typcasting导致了这种情况的发生。问题是在最后一行,在做任何其他事情之前,是否有任何方法刷新该字符?@Gagan93如果您将str[i++]==13替换为str[i++]='\r',您将自己捕获该字符。但是,这会使您的代码与基于UNIX的系统不兼容,因此我将使用if str[I]='\r'| | str[I]='\n'。。。在做任何其他事情之前,有没有方法刷新该字符?@Gagan93如果你用str[i++]='\r'替换str[i++]==13,你会自己捕获该字符。但是,这会使您的代码与基于UNIX的系统不兼容,因此我将使用if str[I]='\r'| | str[I]='\n'。。。并将i++放在单独的行中。