Java字符串程序
我正在尝试使用BufferedReader编写一个字符串程序,从用户那里获取一个字符串并更改字母的大小写。 到目前为止,我得到的是: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
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您的更新代码(可能)工作