我正在尝试使用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);
}
}
}
当我运行它时,它说“可能会丢失精度;需要char;找到int” 有人可以帮我纠正这个吗?
更新: 这是更正后的新代码:
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”。
答案 0 :(得分:3)
char d= c-32;
c-32 表达式导致int
(因为32将被视为int
)并且您正在尝试将int
值分配给char类型,这就是为什么你会“可能失去精度误差”。您需要将32
显式转换为char
(或)右侧的整个表达式char
。
同样的规则同样适用于char d=c+32;
语句以及其他已使用char类型的int值的地方。
答案 1 :(得分:2)
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
。
答案 2 :(得分:0)
一旦进行计算,只需将其转换回char。例如,
char d = (char)(c - 32)
。
它基本上只是希望你澄清并让程序知道你希望它来回转换。
答案 3 :(得分:0)
这是因为当你向一个字符添加一个int它变成一个int时,你会尝试(隐式)将该int转换回一个char,而int
可能不适合&#34; ; char,所以你得到一个错误
让我们说c =&#39; A&#39;,所以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);
}