2013-06-24 7 views
0

Я пытаюсь выполнить строковую программу с использованием BufferedReader, где вы берете строку у пользователя и изменяете регистр букв. это то, что у меня до сих пор:Java String Program

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); 
     } 
    } 
} 

, когда я запускаю его, он говорит, что «возможная потеря точности, требуется полукокса, нашел ИНТ» кто-то может помочь мне исправить это, пожалуйста?

Update: это новый код после коррекции:

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); 
    } 
    } 
} 

но выход не working.Could кто-то отметить мою ошибку, пожалуйста? Когда я вхожу в «a» или «b», выход отсутствует, но когда я вхожу в «E», он меняется на «e», но когда я вхожу в «HIDE», он изменяется на 2 квадрата (я не знаю, как напечатайте его на клавиатуре) и «e».

+2

Используйте 'Character.toUpperCase (символ)' API - http://docs.oracle.com/javase/7/docs/api/java /lang/Character.html#toUpperCase (char) Имейте в виду, что ваш код не будет полностью защищен Unicode до тех пор, пока вы не обратитесь к кодовым точкам с несколькими символами. –

+0

Между прочим: '' for (int a = 1; a> l; a ++) '' должно быть '' for (int a = 0; a zEro

+0

@aqua ваш обновленный код (возможно) работает, но представьте себе, что я нахожусь на вашем коде и не знаю значения unicode для букв. Это похоже на безумие. Использование Character.toUpperCase (char) и Character.isUpperCase (char), и это действительно улучшает читаемость такого типа вещей. –

ответ

3
char d= c-32; 

С-32 результаты экспрессии в int (потому что 32 будет рассматриваться как int), и вы пытаетесь присвоить int значение символьного типа, поэтому вы получаете «возможные потери точности ошибки» , Вам необходимо явно указать 32 на char (или) целое выражение с правой стороны на char.

То же правило применяется и для char d=c+32; оператора и других мест, в которых вы использовали значение int с типом char.

+1

+1 Правда, но использование числового представления символа всегда является хаком. Лучше использовать Character.toUpperCase (char) и аналогичные –

0

Просто выполните возврат к символу, как только вы выполните свои расчеты. Например, char d = (char)(c - 32). Это в основном просто хочет, чтобы вы уточнили, и пусть программа знает, что вы хотите, чтобы она конвертировалась туда и обратно.

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 из-за более высокого приоритета литья.

0

Это происходит потому, что при добавлении Int к персонажу он становится ИНТОМ, то вы пытаетесь (неявно) гипс, что Int назад к полукоксу и int не может «вписаться» полукокс, так что вы получить ошибку

Допустит, что с = «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); 
}