Java Ошибка конкатенации строк в выводе - PullRequest
2 голосов
/ 12 апреля 2020

Я новичок в Java, и у меня возникла эта школьная проблема:

Власти закрытой жилой колонии XYZ хотят, чтобы данные об именах ее жителей были сохранены в следующем формате: назвать его / ее имя отца. Напишите программу, чтобы сопоставить имя отца с именем жителей. Имя должно быть проверено, при проверке имя должно содержать только алфавиты, и пробел допускается. Если имя неверно, выведите сообщение «Неверное имя». Если допустимая строка, тогда преобразуйте ее в верхний регистр и напечатайте

Sample Input 1:

Inmate's name:Aron

Inmate's father's name:Terby

Sample Output 1:

ARON TERBY

Ошибка: Она печатает «Неверный ввод» всякий раз, когда я ввожу двухбуквенное имя заключенного, как-Арон Кумар в противном случае для одного слова строка ввода кода работает нормально.

Это был код, который я написал:


     Scanner sc=new Scanner(System.in);
     System.out.println("Inmate's name:"); //if I enter 2 word string,output-"Invalid name1"//
     String name=sc.nextLine();
     System.out.println("Inmate's father's name:");
     String fname=sc.nextLine();

        String s3=name.toUpperCase();
        String s4=fname.toUpperCase();

        char[] a1= s3.toCharArray();
        char[] a2= s4.toCharArray();
        for(int i=0;i<a1.length;i++)
        {   
            if(a1[i]>='A' && a1[i]<='Z')
             count=1;

            else {
                System.out.print("Invalid name1");
                count=0;
                break; }
        }

        if(count==1)
        {
            for(int i=0;i<a2.length;i++)
           {
            if(a2[i]>='A' && a2[i]<='Z')
            count=2;

            else   {
            System.out.print("Invalid name");
            break; }
       }  
           }

       if(count==2) {
         System.out.print(s3+" "+s4);
                   }
   }
}

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Проблема в том, что вы не проверяете пробел. Проверьте это следующим образом:

if (a1[i] >= 'A' && a1[i] <= 'Z' || a1[i] == ' ')

Другая проблема с вашим кодом заключается в изменении значения count на 1 и 2 в каждой итерации, тогда как оно должно быть изменено после завершения l oop , Ниже приведен исправленный код:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int count = 0, i;
        Scanner sc = new Scanner(System.in);
        System.out.println("Inmate's name:"); 
        String name = sc.nextLine();
        System.out.println("Inmate's father's name:");
        String fname = sc.nextLine();

        String s3 = name.toUpperCase();
        String s4 = fname.toUpperCase();

        char[] a1 = s3.toCharArray();
        char[] a2 = s4.toCharArray();
        for (i = 0; i < a1.length; i++) {
            if (!(a1[i] >= 'A' && a1[i] <= 'Z' || a1[i] == ' ')) {
                System.out.print("Invalid name1");
                count = 0;
                break;
            }
        }

        // If 'i' reached a1.length, it means no invalid character was found
        if (i == a1.length) {
            count = 1;
        }

        if (count == 1) {
            for (i = 0; i < a2.length; i++) {
                if (!(a2[i] >= 'A' && a2[i] <= 'Z' || a2[i] == ' ')) {
                    System.out.print("Invalid name");
                    break;
                }
            }

            // If 'i' reached a2.length, it means no invalid character was found
            if (i == a2.length) {
                count = 2;
            }
        }

        if (count == 2) {
            System.out.print(s3 + " " + s4);
        }
    }
}

Дополнительное примечание:

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Inmate's name: ");
        String name = sc.nextLine();
        System.out.print("Inmate's father's name: ");
        String fname = sc.nextLine();
        if (name.matches("[A-Za-z\\s]+") && fname.matches(("[A-Za-z\\s]+"))) {
            System.out.println(name.toUpperCase() + " " + fname.toUpperCase());
        } else if (!name.matches("[A-Za-z\\s]+")) {
            System.out.println("Inmate's name is invalid");
        } else if (!fname.matches(("[A-Za-z\\s]+"))) {
            System.out.println("Inmate's father's name is invalid");
        }
    }
}

Объяснение регулярного выражения, [A-Za-z\\s]+:

  1. A-Za-z для алфавитов.
  2. \\s для пробелов.
  3. + в конце [A-Za-z\\s]+ означает, что допускается более одного вхождения.

Пример выполнения:

Inmate's name: Ram Kumar
Inmate's father's name: Raj Kumar
RAM KUMAR RAJ KUMAR

Еще один пробный прогон:

Inmate's name: Ram5 Kumar
Inmate's father's name: Raj Kumar
Inmate's name is invalid

Еще один пробный прогон:

Inmate's name: Ram Kumar
Inmate's father's name: Raj5 Kumar
Inmate's father's name is invalid
0 голосов
/ 13 апреля 2020

Когда вы сравниваете char значения в Java, вы полагаетесь на значение ASCII этого символа. Значение ASCII для A равно 65, а значение ASCII для Z равно 90.

Ваш текущий код просто оценивает каждый символ в массиве символов, чтобы убедиться, что он находится в диапазоне от 65 до 90 включительно. Однако значение ASCII для символа пробела равно 32, что выходит далеко за пределы этого диапазона.

Перепишите код, чтобы он принимал заглавные буквы или пробелы (в соответствии с описанием проблемы), например итак:

if((a1[i]>='A' && a1[i]<='Z') || (a1[i] == 32))
0 голосов
/ 12 апреля 2020

Это происходит потому, что здесь

if(a1[i]>='A' && a1[i]<='Z') count=1;

Вы спрашиваете "если char в массиве находится между A и Z, то count = 1"

Но в случае с именем "Aron Kumar" Вы иметь пробел между двумя словами, и этот пробел не находится между A и Z, поэтому count не равен 1, а вывод - "Invalid Input".

Вы также должны проверить массив символов на наличие пробелов.

В качестве хорошего примера вы можете взять ответ MarsAtomi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...