как я могу использовать эту форму 000-00-000 для ввода

#java

#java

Вопрос:

вопрос напишите программу, которая считывает строку, состоящую из имени учащегося, номера социального страхования, идентификатора пользователя и пароля (разделенных одним пробелом). Программа выводит строку, в которой все цифры номера социального страхования и все символы в пароле заменены на x . (Номер социального страхования имеет форму 000-00-000, идентификатор пользователя и пароль не содержат пробелов, а имя не содержит цифр.)

например, ввод: пользовательский ввод: jimin 222-11-222 jimin22 jim2000 объяснение: jimin — это имя пользователя — не должно содержать никаких цифр — 222-11-22 — это номер социального страхования в форме «000-00-000» jimin22 — это идентификатор пользователя, jim2000 — это пароль пользователя

вывод должен быть похож на вывод: jimin xxx-xx-xxx jimin22 xxxxxxx

я не знаю, как сделать имя без цифр
, и я не знаю, как вывести номер социального страхования в форме «000-00-000»

 Scanner input=new Scanner(System.in);
      String name,So_n,ue_id,password;
      int x;
     ////to input
      name=input.next();
      So_n=input.next();
      ue_id=input.next();
      password=input.next();
      ///to output
      System.out.print(name "t");
      x = So_n.length();
      for(int i=0;i<x;i  ){
          System.out.print("x"); }
          System.out.print("t");
      System.out.print(ue_id "t");
      x = password.length();
      for(int i=0;i<x;i  ){
          System.out.print("x"); }
  

Комментарии:

1. Это довольно неясно. Что не так с текущим кодом? Что такое болтун ?

2. я хочу, чтобы социальный номер был int и заменялся на x в форме xxx-xx-xxx и другом отображении сообщения об ошибке пользователя. и имя просто символ

3. Не могли бы вы предоставить нам дополнительные входные данные и соответствующий вывод, пожалуйста? Сейчас действительно сложно понять вашу проблему, возможно, с этими данными все прояснится, и мы сможем вам помочь.

4. Если номер социального страхования всегда имеет форму 000-00-0000, почему бы вместо этого просто не распечатать xxx-xx-xxx?

5. @mayamar Я думал об этом, но что, если пользователь вставит числа, превышающие 000-00-000, программа, должно быть, отправит неверное сообщение

Ответ №1:

Похоже, что суть проблемы заключается в замене символов, а не просто в распечатке некоторых символов ‘X’. Следовательно, подход, который обрабатывает замену, был бы наиболее подходящим.

Вот несколько примеров методов, которые могли бы ответить на вопрос OP. Могут быть легко добавлены дополнительные методы для проверки имени пользователя, пароля с точки зрения любой сложности и т.д. Не было предоставлено никаких подробностей о том, что делать в случае неверного ввода, поэтому в одном случае здесь просто выводится сообщение.

 // for a non-null password, return a String of the same length with all
//   of the characters set to an 'X'
public static String getObfuscatedPassword(String pw)
{
    Objects.requireNonNull(pw, "Null pw input");
    return pw.replaceAll(".", "X");
}

// for a non-null ssn, return a String where every digit is replaced
//   by an 'X'; other characters (such as a -) are unchanged
public static String getObfuscatedSSN(String ssn)
{
    Objects.requireNonNull(ssn, "Null ssn input");

    return ssn.replaceAll("[0-9]", "X");
}

// return true if the specified ssn is not null and
//   matches the format of ###-##-###
public static boolean isValidSSN(String ssn)
{
    // ensures there is something for us to validate
    //   NOTE: technically the .isEmpty is not needed
    if (ssn == null || ssn.isEmpty()) {
        return false;
    }

    // ensure in the format of ###-##-###
    return Pattern.matches("[\d]{3}-[\d]{2}-[\d]{3}", ssn);
}

// returns true if the username has at least one character, and
//  no digits; does not prevent having spaces in the name (could
//  be added); uses a for loop rather than regular expressions for
//  a fun difference in approach
public static boolean isValidUsername(String name)
{
    boolean charFound = false;
    boolean digitFound = false;
    if (name == null || name.isEmpty()) {
        return false;
    }

    for (int i = 0; i < name.length();   i) {
        // check if the current name[i] is a letter or digit
        //  the OR will keep a true once it is set
        charFound = charFound || Character.isLetter(name.charAt(i));
        digitFound = digitFound || Character.isDigit(name.charAt(i));
    }

    return charFound amp;amp; ! digitFound;
}
  

Пример драйвера:

 public static void main (String[] args) throws java.lang.Exception
{
    String user = "jimin";
    String ssn = "222-11-222";
    String password = "WhatAWonderfulWorldItWouldBe";

    if (! isValidSSN(ssn)) {
        System.err.println("Invalid SSN");
    }

    String xdSsn = getObfuscatedSSN(ssn);

    String xdPw = getObfuscatedPassword(password);

    System.out.printf("st%st%s%n", user, xdSsn, xdPw);

}
  

Пример вывода:

   jimin   XXX-XX-XXX  XXXXXXXXXXXXXXXXXXXXXXXXXXXX
  

Использование лучших имен переменных было бы неплохо.

Какой-нибудь онлайн-пример на:https://ideone.com/cPV2ob

Комментарии:

1. спасибо, у меня есть только один вопрос, как я могу создать строку без цифр?

2. @HalaHani, если ваш вопрос заключается в том, как определить цифры в строке, я привел пример в isValidUsername() ответе. Если ваш вопрос заключается в том, как их удалить, то String noDigits = str.replaceAll("[0-9] ","");

3. Когда пользователь вводит строку с цифрами, я хочу передать сообщение об ошибке пользователя просто

4. Адаптируйте метод isValidUsername(String) по мере необходимости. Она вернет true, если цифр нет, и false, если есть цифры. Проверив это, вы можете затем выдать вывод с ошибкой.

5. Большое вам спасибо, теперь у меня есть только один вопрос, как я могу определить, что после второго ‘-‘ пользователь должен ввести 3 числа просто

Ответ №2:

Для замены цифр в едином входе:

     x = So_n.length();
    for (int i = 0; i < x; i  ) {
        if ('0' <= So_n.charAt(i) amp;amp; So_n.charAt(i) <= '9') {
            System.out.print("x");
        } else {
            System.out.print(So_n.charAt(i));
        }
    }
  

Комментарии:

1. нет, это не выполняется, потому что So_n должен быть в форме 000-00-000