简单java代码中的一些错误
这是一个简单的Java代码,它在不使用任何字符串API函数的情况下反转字符串,但在最后一行中,当它打印反转的字符串时,输出语句System.out.println中出现了一些问题 代码如下:简单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;
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++放在单独的行中。