我正在尝试使用BufferedReader编写String程序,在该程序中,您从用户那里获取String并更改字母的大小写。这是到目前为止我得到的:
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.*;
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;
char d;
for(int a=1;a<l;a++)
{
c=str.charAt(a);
if(c>=97 && c<=122)
{
d= (char)(c-32);
}
else if(c>=65 &&c<=90);
{
d=(char)(c+32);
}
System.out.print(d);
}
}
}
但是输出无法正常工作。有人可以指出我的错误吗?当我输入“ a”或“ b”时,没有输出,但是当我输入“ E”时,它变为“ e”,但是当我输入“ HidE”时,它变为2个正方形(我不知道如何打印在键盘上)和“ e”。
char d= c-32;
c-32表达式的结果为int
(因为32将被视为int
),并且您试图将int
值分配给char类型,因此这就是为什么“可能丢失精度误差”。您需要将32
显式转换为char
(或)将整个表达式右侧转换为char
。
相同的规则也适用于char d=c+32;
语句,以及在使用char类型的int值的其他地方。
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
。
进行计算后,只需将其转换回char。例如,char d = (char)(c - 32)
。它基本上只是希望您澄清一下,让程序知道您想要它来回转换。
发生这种情况是因为当您将一个int加到一个字符上时它就变成一个int,然后您试图(隐式)将该int强制转换回char,并且int
可能不“适合” char,因此您得到一个错误
让我们说c ='A',所以65
char d= c+32
char d= 65+32
char d= 97;
现在97可能对应一个有效的字符,但是我们不知道在编译时(原则上它可以是任何整数),如果int
太大或太小而无法容纳在char中,则部分它被扔掉了;因此警告。您可以将其转换为(char)以表示您接受,但是整个过程并不好。
char d= (char)(c+32);
所有这些看起来都像是检查大小写并将其设置为小写(反之亦然)。如果是这样的话;不要这样做,真的很不清楚,使用:
c=str.charAt(a);
if(Character.isUpperCase(c)){
char d=Character.toLowerCase(c);
}