Java字符串程序

Java字符串程序,java,bufferedreader,Java,Bufferedreader,我正在尝试使用BufferedReader编写一个字符串程序,从用户那里获取一个字符串并更改字母的大小写。 到目前为止,我得到的是: import java.io.*; public class StringProg { public void ff()throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out

我正在尝试使用BufferedReader编写一个字符串程序,从用户那里获取一个字符串并更改字母的大小写。 到目前为止,我得到的是:

import java.io.*;
public class StringProg {
    public void ff()throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter a sentence");
        String str=br.readLine();
        String s="";
        int l=str.length();
        char c;
        for(int a = 1; a < l; a++) {
            c = str.charAt(a);
            char d = 0;
            if(c >= 97 && c <= 122) {
                d = c - 32;
            } else if(c >= 65 && c <= 90) {
                d = c + 32;
            }
         System.out.print(d);
        }
    }
}
import java.io.*;
公共类StringProg{
public void ff()引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
System.out.println(“输入句子”);
字符串str=br.readLine();
字符串s=“”;
int l=str.length();
字符c;
对于(int a=1;a=97&&c=65&&c
c-32表达式导致
int
(因为32将被视为
int
),并且您正试图将
int
值分配给类型char,这就是您获得“可能的精度损失错误”的原因。您需要显式地将
32
强制转换为
char
(或)右侧的整个表达式指向
char

同样的规则也适用于
chard=c+32;
语句,以及您使用int-value和char-type的其他地方

c-32表达式导致
int
(因为32将被视为
int
),并且您正试图将
int
值分配给类型char,这就是您获得“可能的精度损失错误”的原因。您需要显式地将
32
强制转换为
char
(或)右侧的整个表达式指向
char


同样的规则也适用于
char d=c+32;
语句和其他您在char type中使用int-value的地方。

只要在您进行计算后转换回char即可。例如,
chard=(char)(c-32)

它基本上只是想让你澄清一下,让程序知道你想让它来回转换。

只要在你计算完后再转换成一个字符就行了。例如,
char d = (char) (c-32); // note the parentheses
char d = (char) (c+32); // around (char + int); see below
chard=(char)(c-32)
。 它基本上只是想让你澄清,让程序知道你想让它来回转换

char d = (char) (c-32); // note the parentheses
char d = (char) (c+32); // around (char + int); see below
  • 32
    是一个
    int
    文本。由(
    char
    +
    int
    )算法产生的表达式也是
    int
    类型。由于
    char
    的范围是
    int
    的子集,编译器抱怨可能会丢失精度。通过显式转换为
    (char)
    ,您实际上是在告诉编译器您知道自己在做什么

  • 注意,算术表达式
    (c+32)
    周围的括号。如果没有括号,编译器会将其计算为
    (char)(c)+32
    ,由于强制转换的优先级较高,这再次导致
    int

  • 32
    是一个
    int
    文本。由(
    char
    +
    int
    )算法产生的表达式也是
    int
    类型。由于
    char
    的范围是
    int
    的子集,编译器抱怨可能会丢失精度。通过显式转换为
    (char)
    ,您实际上是在告诉编译器您知道自己在做什么

  • 注意,算术表达式
    (c+32)
    周围的括号。如果没有括号,编译器会将其计算为
    (char)(c)+32
    ,由于强制转换的优先级较高,这再次导致
    int


发生这种情况的原因是,当您将int添加到字符时,它会变成int,然后您尝试(隐式地)将该int转换回char,而
int
可能无法“适应”该字符,因此会出现错误

假设c='A',那么65

char d= c+32
char d= 65+32
char d= 97;
现在97可能对应于一个有效字符,但我们不知道在编译时(原则上它可以是任何整数),如果
int
太大或太小而无法放入字符,那么它的一部分就会被丢弃;因此会发出警告。您可以将它转换为(char)表示接受,但整个过程并不顺利

char d= (char)(c+32);
所有这些看起来都像是在检查资本化情况并将其设置为小写(反之亦然)。如果是这样,请不要这样做,因为它确实不清楚,请使用:

c=str.charAt(a);
if(Character.isUpperCase(c)){
     char d=Character.toLowerCase(c);
}

出现这种情况的原因是,当您将int添加到字符时,它将变成int,然后您尝试(隐式)将该int转换回char,而
int
可能无法“适应”该字符,因此会出现错误

假设c='A',那么65

char d= c+32
char d= 65+32
char d= 97;
现在97可能对应于一个有效字符,但我们不知道在编译时(原则上它可以是任何整数),如果
int
太大或太小而无法放入字符,那么它的一部分就会被丢弃;因此会发出警告。您可以将它转换为(char)表示接受,但整个过程并不顺利

char d= (char)(c+32);
所有这些看起来都像是在检查资本化情况并将其设置为小写(反之亦然)。如果是这样,请不要这样做,因为它确实不清楚,请使用:

c=str.charAt(a);
if(Character.isUpperCase(c)){
     char d=Character.toLowerCase(c);
}

使用
Character.toUpperCase(char)
API——请记住,在处理多字符代码点之前,您的代码不会完全是Unicode安全的。除此之外:
for(int a=1;a>l;a++)
应该是
for(int a=0;a@aqua您的更新代码(可能)工作正常,但想象一下,当我遇到你的代码时,碰巧不知道字母的unicode值。这看起来很疯狂。使用Character.toUpperCase(char)和Character.isUpperCase(char)这确实提高了这类内容的可读性在
else if
后面有一个分号。Java将把它解释为
else if
的主体,并将始终执行您想要的主体:
d=(char)(c+32)
删除
行末尾的分号,如果是
行,请使用
字符.toUpperCase(char)
API--请记住,在处理多字符码点之前,您的代码不会完全是Unicode安全的。除此之外:
for(int a=1;a>l;a++)
应该是
for(int a=0;a@aqua您的更新代码(可能)工作