题目: 编写一个截取字符串的方法,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。
提示:中文由两个字节组成,这两个字节均为负数。
只判断中文字符 和英文字符的。
中文为2个字节  英文为1个字节。
 我的代码如下,不对哦
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args)
{
System.out.println("请输入字符串");
Scanner input=new Scanner(System.in);
String inputString=input.next();
System.out.println("请输入截取字节:");
int j=input.nextInt();

for(int i=0;i<j;i++)
        {
    char lastly=inputString.charAt(i);
    StringBuffer aa=new StringBuffer("");
    if(lastly<65&&lastly>125)
    {
     aa.append(lastly);
     j--;
    
    }else{
     aa.append(lastly);
    
    }

    System.out.print(aa.toString());
    
}
}请高手将错误具体的列出来下,让我也学学 多谢了。

解决方案 »

  1.   


    import java.util.Scanner; 
    public class Demo2 { 
    public static void main(String[] args) { 
    System.out.println("请输入字符串"); 
    Scanner input=new Scanner(System.in); 
    String inputString=input.next(); 
    System.out.println("请输入截取字节:"); 
    int j=input.nextInt(); 
    StringBuffer aa = new StringBuffer();
    for(int i=0;i<j;i++) { 
    char lastly=inputString.charAt(i);
    aa.append(lastly);
    }
    System.out.print(aa.toString()); 
    }
    }这是我改后的,和你对比一下!
      

  2.   

    另外,Java中的字符采用Unicode编码,一个字符占两个字节,所以不用那么麻烦的判断,直接charAt(i)取出就行了!
      

  3.   

    你的错误,具体的来说,有两个,一个是for后面缺个大括号,第二个是当后面打印的时候,超出了aa的作用域!
      

  4.   


    import java.util.Scanner;
    public class Demo2 {
        public static void main(String[] args) {
            System.out.println("请输入字符串");
            Scanner input=new Scanner(System.in);
            String inputString=input.next();
            System.out.println("请输入截取字节:");
            int j=input.nextInt();
            
            //aa的申明放到外面,否则后面打印的时候就超出了aa的作用域
            StringBuffer aa=new StringBuffer("");
            for(int i=0;i<j;i++) {
                char lastly=inputString.charAt(i);
               
                /*if(lastly<65&&lastly>125)
                {
                    aa.append(lastly);
                    j--;
                        
                }else{
                    aa.append(lastly);
                    
                }*/
                //Java中的字符采用Unicode编码,一个字符占两
                //个字节,所以不用那么麻烦,直接加入就行了
                aa.append(lastly);
             }//这里缺了个括号
             System.out.print(aa.toString());
         }
    }
      

  5.   

    尽量不要改变循环的条件判断值,这样会带来很乱的结果。而且:for(int i=0;i<j;i++) 这里不严谨,如果 j 大于 inputString 长度的话会报错的。我重写了一个,你看一下吧public class Test {    public static void main(String[] args) {
            String str = "我ABC汉DEF";
            System.out.println(truncate(str, 6));
        }    public static String truncate(String str, int length) {
            if((str == null) || (str.length() == 0) || (length < 0)) {
                return str;
            }
            char[] chs = str.toCharArray();
            int len = 0;
            int offset = 0;
            for(int i = 0; i < chs.length; i++, offset++) {
                len += (chs[i] > 0xff) ? 2 : 1;
                if(len > length) {
                    break;
                }
            }
            if(offset == chs.length) {
                return str;
            }
            return new String(chs, 0, offset);
        }
    }
      

  6.   

    我是楼主
    我修改下了 但是依然有错误,希望哪个改下。
    import java.util.Scanner;
    public class Demo2 {
    public static void main(String[] args)
    {
    System.out.println("请输入字符串");
    Scanner input=new Scanner(System.in);
    String inputString=input.next();
    System.out.println("请输入截取字节:");
    int j=input.nextInt();
    StringBuffer aa=new StringBuffer("");


    for(int i=0;i<inputString.length();i++)
    {
    char bb=aa.charAt(i);
    if(bb<0&&j>1)
    {
    aa.append(bb);
    j=j-2;
    }else if(j>0)
    {
    aa.append(bb);
    j--;
    }
    }
        System.out.print(aa.toString());
    }
    }
      

  7.   

    上面是我看错了,不好意思!这是我刚写的!import java.util.Scanner;
    public class Demo2 {
        public static void main(String[] args) throws Exception {
            System.out.println("请输入字符串");
            Scanner input=new Scanner(System.in);
            String inputString=input.next();
            System.out.println("请输入截取字节:");
            int j=input.nextInt();
            
            StringBuffer aa=new StringBuffer("");
            byte[] b = inputString.getBytes("gb2312");//得到特定编码的字节数组
            byte[] temp = new byte[2];//申明一个字节数组,用来保存取出的每一个字符,一个汉字两个,字母为一个
            for(int i=0;i<j;i++) {
              temp[0] = (byte)b[i];
              if(temp[0] < 0) {//是汉字,两个字节生成一个新的字符串
                temp[1] = (byte)b[++i];
                aa.append(new String(temp));
                continue;
              }
              //否则非汉字,转换为字符
              aa.append((char)temp[0]);
            }
            System.out.print(aa.toString());
         }
    }
      

  8.   

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.StringBuffer.charAt(Unknown Source)
    at Demo2.main(Demo2.java:17)
      

  9.   

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.StringBuffer.charAt(Unknown Source)
    at Demo2.main(Demo2.java:17)
      

  10.   

            StringBuffer aa=new StringBuffer("");
            aa什么都没有
            
            for(int i=0;i<inputString.length();i++){
                char bb=aa.charAt(i);  //这里你取字符?肯定取不到。
      

  11.   

    ASCll 码 小于0 就是汉字 否则 就是字母
    我觉得很好取  但是就有个错误
      

  12.   

    java采用的是Unicode编码,字母的Unicode编码和ascii码相同,但是汉字的是按具体的规定算出来的!
      

  13.   

    我这样写就是对的
    import java.util.Scanner;
    public class Demo2 {
    public static void main(String[] args)
    {
    System.out.println("请输入字符串");
    Scanner input=new Scanner(System.in);
    String inputString=input.next();
    System.out.println("请输入截取字节:");
    int j=input.nextInt();
    StringBuffer aa=new StringBuffer(inputString);


    for(int i=0;i<inputString.length();i++)
    {
    char bb=aa.charAt(i);
    if(bb>255&&j>1)
    {
    System.out.print(bb);
    j=j-2;
    }else if(j>0&&bb<255)
    {
    System.out.print(bb);
    j--;
    }
    } }
    }
    但是我想用  aa.append方法输出 该怎么修改啊
      

  14.   

    我这样写就是对的
    import java.util.Scanner;
    public class Demo2 {
    public static void main(String[] args)
    {
    System.out.println("请输入字符串");
    Scanner input=new Scanner(System.in);
    String inputString=input.next();
    System.out.println("请输入截取字节:");
    int j=input.nextInt();
    StringBuffer aa=new StringBuffer(inputString);


    for(int i=0;i<inputString.length();i++)
    {
    char bb=aa.charAt(i);
    if(bb>255&&j>1)
    {
    System.out.print(bb);
    j=j-2;
    }else if(j>0&&bb<255)
    {
    System.out.print(bb);
    j--;
    }
    } }
    }
    但是我想用  aa.append方法输出 该怎么修改啊
      

  15.   

            StringBuffer aa=new StringBuffer("");
            
            
            for(int i=0;i<inputString.length();i++)
            {
                char bb=inputString.charAt(i);
      

  16.   


    import java.util.Scanner; 
    public class Demo2 { 
    public static void main(String[] args) { 
    System.out.println("请输入字符串"); 
    Scanner input=new Scanner(System.in); 
    String inputString=input.next(); 
    System.out.println("请输入截取字节:"); 
    int j=input.nextInt(); 
    StringBuffer aa=new StringBuffer(); //用aa来保存结果
    for(int i=0;i<inputString.length();i++) { 
    char bb=inputString.charAt(i); //这里用inputString就行了
    if(bb>255&&j>1) { 
    aa.append(bb);
    j=j-2; 
    }else if(j>0&&bb<255) { 
    aa.append(bb);
    j--; 

    }
    System.out.println(aa.toString()); 

    }
      

  17.   

    关于字节,楼主如果有兴趣,可以加一句
    System.out.println(Integer.toBinaryString(bb) );
    看看中文与英文有什么样的不同。
    我记得ASCII本身用到的只有7位
    中文的第一个,应该是个1
    时间比较久远,记不太清了。