A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;

  2. import java.io.IOException;
  3. import java.util.Scanner;

  4. /**
  5. * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  6. * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中
  7. * */
  8. public class Test10 {

  9.         public static void main(String[] args) {
  10.                 Scanner input = new Scanner(System.in);


  11.                         while(true){   /循环的时候跳过了输入字符串直接到了输入字节数那步?
  12.                                
  13.                                 System.out.println("请输入一串字符:");
  14.                                 String str = input.nextLine();

  15.                                 System.out.println("请输入截取的字节个数(非0非负数的整数):");
  16.                                 int count = input.nextInt();

  17.                                 if ("".equals(str) || count <= 0) {
  18.                                         System.out.println("请输入正确参数!");
  19.                                         continue;
  20.                                 }
  21.                                 else {
  22.                                         try {
  23.                                                 String cutstr = splitstr(str, count); // 调用方法截取后
  24.                                                 System.out.println("截取前:" + str + "\n截取后:" + cutstr);
  25.                                         } catch (IOException e) {
  26.                                                 // TODO Auto-generated catch block
  27.                                                 e.printStackTrace();
  28.                                         }
  29.                                 }
  30.                         }               

  31.         }

  32.         public static String splitstr(String str, int count) throws IOException {

  33.                 // 定义截取之后的字符串

  34.                 String cutstr = str.substring(0, count > str.length() ? str.length()
  35.                                 : count);

  36.                 int leng = cutstr.getBytes("GBK").length; // 获取截取之后字符串的长度

  37.                 while (leng > count) // 如果截取之后的长度比所要求的长度大的话说明有汉字
  38.                 {
  39.                         int cutLen = --count; // 一个汉字占2个字节
  40.                         cutstr = str.substring(0, cutLen > str.length() ? str.length()
  41.                                         : cutLen);
  42.                         leng = cutstr.getBytes("GBK").length;
  43.                 }
  44.                 return cutstr;

  45.         }

  46. }
复制代码
虽然能够处理题目上的例子但是还是有些问题的。
问题:1.第一次以后循环的时候跳过输入字符串,直接要求输入字节数了?
  PS:为什么会出现这个情况,有什么好的解决方案?
2.如果输入的都是汉字的话,比如输入:是是是  字节数为:2 的话结果是空的
debug的时候发现截取的时候其实是截取了2个汉字也就是4个字节所以最后判断有汉字的方式是有问题的
在这里与大家交流交流一下,希望大家多多指教

6 个回复

倒序浏览
Unicode码和GBK码中“m”不应该表示两个字节长度码?只不过第一个字节全部为00000000
回复 使用道具 举报
我看不懂你这个截取是怎么回事,刚才复制到我的eclipse试了一下,正在试,有一个问题。
就是当你循环到第二遍的时候,就会直接跳过输入字符串 直接让输入数字。
这是因为nextInt();下面使用nextLine();这个nextLine();就会失效。具体原因你可以看我今天刚刚发表的帖子。
回复 使用道具 举报
WosLovesLife 发表于 2015-11-6 15:19
我看不懂你这个截取是怎么回事,刚才复制到我的eclipse试了一下,正在试,有一个问题。
就是当你循环到第二 ...

恩呢,谢谢提醒,
刚试了下将nextInt()换成nextLine()然后再转成int类型是可以的。
回复 使用道具 举报
10010011 发表于 2015-11-6 17:44
恩呢,谢谢提醒,
刚试了下将nextInt()换成nextLine()然后再转成int类型是可以的。 ...

直接把nextLine();换成next();也可以。
回复 使用道具 举报
看看  学习一下  。。。。。。。。。。。。
回复 使用道具 举报
大自然的搬运工 发表于 2015-11-6 15:17
Unicode码和GBK码中“m”不应该表示两个字节长度码?只不过第一个字节全部为00000000 ...

谢谢你关于编码方面的提醒,然后我修改了下后面获取长度的代码已经解决,感谢你的帮助。
  1. String cutstr = str.substring(0, count > str.length() ? str.length()
  2.                                 : count);

  3.                 int leng = cutstr.getBytes().length; // 获取截取之后字符串的长度

  4.                 while (leng > count) // 如果截取之后的长度比所要求的长度大的话说明有汉字
  5.                 {
  6.                         int cutLen =count - 1; // 在原有的截取长度减1
  7.                         cutstr = str.substring(0, cutLen > str.length() ? str.length()
  8.                                         : cutLen);
  9.                         leng = cutstr.getBytes().length;
  10.                 }
  11.                 return cutstr;
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马