尝试使用ASCII值切换案例

时间:2014-09-03 15:58:35

标签: java

好的,我只是一个编程的业余爱好者,所以对我很轻松。因此,我编写了经典的切换案例程序,但没有使用.toUpperCase()或.toLowerCase()函数,而是使用字符的ASCII值。我设法将大写字母转换为较低的情况,但似乎无法做相反的事情。

包裹切换;

import java.util.Scanner;

public class Toggle {
    String str;
    Scanner sc=new Scanner(System.in);

    public void toggleStr()
    {
        System.out.println("Enter a string");
        str=sc.nextLine();
        char c;
        int res;
        char ch[]=str.toCharArray();

        for(int i=0;i<ch.length;i++)
        {
            res=(int)(ch[i]);
            if((res>=65)||(res<=90))
            {
                c=(char)(res+32);
                System.out.print(c);
            }
            else if((res>=97)||(res<=122))
            {
                c=(char)(res-32);
                System.out.print(c);
            }

            else
                System.out.print(ch[i]);
        }

    }


    public static void main(String[] args) 
    {
        Toggle t=new Toggle();
        t.toggleStr();
    }
}

3 个答案:

答案 0 :(得分:3)

在这两种情况下,

||应为&&。任何数字都大于65或小于90,因此每次执行第一个if块,无论字符如何。

答案 1 :(得分:2)

97到122之间的所有值都大于65,因此您的第一个if条件将包括小写字符和大写字符。您需要使用&&代替||(而不是或)。

答案 2 :(得分:1)

如果我们谈论好的旧ASCII表,那么每个小写字母与大字母的区别仅在于由十进制32或十六进制0x20表示的一位(2 ^ 5,6位)。

但如果我们谈论的是XXI世纪的unicode,我们可以使用java std库函数。

下面我展示了两个版本:

ASCII样式:

public String toggleAscii(String s) {
    StringBuilder sb = new StringBuilder(s.length());

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') {
            boolean isLower = (c & 0x20) == 0x20; // binary 100000 (sixth bit, 2^5)
            c = (char) (isLower ? (c & 0xdf) : (c | 0x20));
        }
        sb.append(c);
    }

    return sb.toString();
}

Unicode样式:

public String toggle(String s) {
    StringBuilder sb = new StringBuilder(s.length());

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        boolean isUpper = Character.isUpperCase(c);
        sb.append(isUpper ? Character.toLowerCase(c) : Character.toUpperCase(c));
    }

    return sb.toString();
}